在 avr-gcc 编译器上进行位移时是否存在错误?
Is there a bug when bit-shifting on the avr-gcc compiler?
在 avr-gcc 5.4.0 下处理 atmega328 芯片上的位移位时,我注意到一个错误 (?)。让我们看一些片段:
此代码按预期工作:
uint32_t val = 0xaabbccdd;
Serial.println( val, HEX ); //Output: aabbccdd
// For testing 32 bit variables
这个也有效:
uint16_t read = 0x3FF;
uint32_t val = read * 65536;
Serial.println( val, HEX ); // Output: 3ff0000
但这不是!:
uint16_t read = 0x3FF;
uint32_t val = read << 16;
Serial.println( val, HEX ); // Output: 0
(小于16系统甚至崩溃!)
编译器中是否存在任何已知错误?
谢谢!
uint16_t read = 0x3FF;
uint32_t val = read << 16;
由于read
只有16位宽,从右移入16个0,所以val
的结果是0
。正如评论中已经建议的那样,您必须使用 uint32_t 的显式转换。
uint16_t read = 0x3FF;
uint32_t val = read * 65536;
这不需要转换就可以工作,因为 65536 被处理为 int32_t(因为它不适合 uint16_t)因此,乘法的结果是 int32_t 和不会溢出。
在 avr-gcc 5.4.0 下处理 atmega328 芯片上的位移位时,我注意到一个错误 (?)。让我们看一些片段:
此代码按预期工作:
uint32_t val = 0xaabbccdd;
Serial.println( val, HEX ); //Output: aabbccdd
// For testing 32 bit variables
这个也有效:
uint16_t read = 0x3FF;
uint32_t val = read * 65536;
Serial.println( val, HEX ); // Output: 3ff0000
但这不是!:
uint16_t read = 0x3FF;
uint32_t val = read << 16;
Serial.println( val, HEX ); // Output: 0
(小于16系统甚至崩溃!)
编译器中是否存在任何已知错误?
谢谢!
uint16_t read = 0x3FF;
uint32_t val = read << 16;
由于read
只有16位宽,从右移入16个0,所以val
的结果是0
。正如评论中已经建议的那样,您必须使用 uint32_t 的显式转换。
uint16_t read = 0x3FF;
uint32_t val = read * 65536;
这不需要转换就可以工作,因为 65536 被处理为 int32_t(因为它不适合 uint16_t)因此,乘法的结果是 int32_t 和不会溢出。