在学习C语言的过程中发现了如下问题:
程序a :编译没警告,下面是结果
程序b :
问题: 将一个32位的二进制数的每一位都写成1的结果就是4294967295,按理来说这是属于unsigned int的范围,但是为什么会报错呢?很不理解。
在学习C语言的过程中发现了如下问题:
程序a :编译没警告,下面是结果
程序b :
问题: 将一个32位的二进制数的每一位都写成1的结果就是4294967295,按理来说这是属于unsigned int的范围,但是为什么会报错呢?很不理解。
32的int的头一位是用来表示符号的,第一位为0则为正数,第一位为1则为负数。unsigned int只是说不把第一位当符号了,因为它表示的是无符号的整数,也就是比有符号的多了一位,所以可以表示得更大! 你输入的-1,它只是当成了第一位是1最后 一位是1的无符号数
原因在于 你源代码里指定的
4294967295
这个数字 没有被编译器当作一个int
来处理。而
int型数值的范围是(-2147483648~2147483647)
,4294967295
已经超出这个范围了,所以编译器会将他当成一个long
型的值存储,而long
就已经不止4个字节了,但最终你要将一个long
赋值给一个4字节的无符号整型
必然会发生精度丢失
,所以编译器会发出警告。