在学习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的无符号数
1 回答821 阅读
564 阅读
原因在于 你源代码里指定的
4294967295这个数字 没有被编译器当作一个int来处理。而
int型数值的范围是(-2147483648~2147483647),4294967295已经超出这个范围了,所以编译器会将他当成一个long型的值存储,而long就已经不止4个字节了,但最终你要将一个long赋值给一个4字节的无符号整型必然会发生精度丢失,所以编译器会发出警告。