关于int

在进行单片机编程时,我们经常用Int定义变量。以前学C语言时,我知道int它表示的位数跟具体的硬件结构有关。不过看了一本书中“慎用int”这节后,我对int又有了更一步的认识。

原来C语言并没有进一步明确不同硬件平台下int位宽由硬件平台决定这一点,从而导致了对int不同的理解。实际上int并没有具体的位宽限制,是由所用硬件平台(MCU)和编译器共同决定位宽为多少,通常情况下编译器会将int的位宽定为与所用MCU的位宽一致。

文中也举了两个例子说明因为对int理解的不够深入而犯的错误。一个是因为将int误理解为32位,而编译器和MCU为16位宽。一个产品需要显示开机后的时间,显示精度为秒。如果按照int为32位的话,定义secondCount为unsigned int的话,这是肯定能满足要求的。但当int被编译器按照16位来处理的话,最大记录的时间只能差不到18小时,产品用到正常上班时段是正常的。如果开机时间长的话,很久才关机一次,那么这个产品就会有问题了。另外一个例子是如果开始一款32位MCU做的产品,后来发现一款16位的MCU可以替代,这时要进行代码的移植。但16位MCU编译器认为int为16位,这是就存在溢出的问题。如果把int替换为long,可能把其他的地方也改动错误。

其实有解决的办法,C语言它本身提供了更为精确的数据类型。char,short,long long 分别严格对应8位,16位,32位,64位。绝大多数编译器编译出来的结果都满足这种对应关系。

最后,文中给出一个建议,用C语言编程的时候,一定要谨慎使用int,最好是不用。


参考《删繁就简——单片机入门到精通》

每天进步一点。

你可能感兴趣的:(关于int)