(a_a) 发表于 2017-7-30 16:10:26

uint32_t temp0 = 0x0000FFFF << 16; 编译时发出警告

ad.c(261): warning:#61-D: integer operation result is out of range
        volatile uint32_t temp0 = 0x0000FFFF << 16;
ad.c(261): warning:#68-D: integer conversion resulted in a change of sign
        volatile uint32_t temp0 = 0x0000FFFF << 16;

有啥需要注意的的么?

发表于 2017-7-31 10:25:20

编译器认为定义的是int型的。因此会超出范围,修改如下:
volatile uint32_t temp0 = (uint32_t)0x0000FFFF << 16;

MrJiu 发表于 2017-7-31 10:34:10

你把改成这样,就不会提示了
volatile uint32_t temp0 = (uint32)0x0000FFFF << 16;
提示的原因很简单,就是你把数据写成0x0000FFFF这样,并不表示是32位数据,而实际可能是16位的数据;16位的数据,移位超过16,编译器给出警告是很正常的。当然了,写成0x0001FFFF这样,就是32位的数据了。。。所以最好使用的时候,前面加一个强制转换。。。

Dandjinh 发表于 2017-7-31 11:32:28

0x0000FFFF编译器默认的是有符号的,你左移16位,最高位变成1,对应的数值就变成负值,由于负值的补码和正值的补码方式不一样,所以编译器一般都会警告下,可以忽略,如果嫌麻烦,你可以这样写
volatile uint32_t temp0 = 0x0000FFFFUL << 16;
这个UL后缀就告诉编译器这是无符号长整形

(a_a) 发表于 2017-8-2 23:21:31

@安 @MrJiu @Dandjinh
感谢楼上3位,不一一回复了,
我是想的既然定义了 uint32_t为啥还给我发警告,忽略了立即数也得给个规范,谢谢!
虽然运行没有问题,但既然发出了警告,我怕出现莫名错误,已修改了实现方式,让它无警告,:loveliness:
页: [1]
查看完整版本: uint32_t temp0 = 0x0000FFFF << 16; 编译时发出警告