|
发表于 2013-9-16 22:49:54
|
显示全部楼层
wxty 发表于 2013-9-16 16:57
提到前面来,望高人指点。
仔细看了楼主的回复,可能我还是没有看懂用uint8的好处,不是也不能解决整型提升 ... 默认情况下,这两处定义是等价的。但是如果更改编译参数的话,就不同了(也涉及到代码优化的一个方法)。
GCC的AVR移植版本有一个“-mint8”参数,GCC官方手册说明:
-mint8
Assume int to be 8-bit integer. This affects the sizes of all types: a char is 1 byte, an int is 1 byte, a long is 2 bytes, and long long is 4 bytes. Please note that this option does not conform to the C standards, but it results in smaller code size.
使用这个参数意味着int类型被降为1个字节,那么当执行1个字节变量的比较、移位时,就不存在提升类型的问题了。由于减少了提升带来的运算开销,编译后的代码占用会减少,而且不影响运行速度(应该说16位变8位运算后,反而运行速度更快了些)。
但这是有副作用的,如果你的变量全是用int、long等方式定义的,一旦使用该参数,会导致所有变量的长度减少一半,因而数值范围减少一半,如果不仔细检查,可能会因为范围溢出导致运行错误。而且4字节得用long long,可能会引起和库函数的不兼容。
不过如果代码中变量都用int16_t等方式定义的,不受该参数影响,依然会是2个字节长度,所以这个时候int16_t并不等价于int。 |
|