首页 > 关于C语言unsigned int 的问题

关于C语言unsigned int 的问题

在学习C语言的过程中发现了如下问题:
程序a :编译没警告,下面是结果


程序b

问题: 将一个32位的二进制数的每一位都写成1的结果就是4294967295,按理来说这是属于unsigned int的范围,但是为什么会报错呢?很不理解。


32的int的头一位是用来表示符号的,第一位为0则为正数,第一位为1则为负数。unsigned int只是说不把第一位当符号了,因为它表示的是无符号的整数,也就是比有符号的多了一位,所以可以表示得更大! 你输入的-1,它只是当成了第一位是1最后 一位是1的无符号数


4294967295u


原因在于 你源代码里指定的4294967295这个数字 没有被编译器当作一个int来处理。

因为源代码其实就是一个字符串组成的文本,源代码文本里的4294967295这个其实也是一个字符串,被编译器读取,如果没有指定他的类型,那么编译器会识别出他的类型,再用对应的类型存储。

int型数值的范围是(-2147483648~2147483647) ,4294967295已经超出这个范围了,所以编译器会将他当成一个long型的值存储,而long就已经不止4个字节了,但最终你要将一个long赋值给一个4字节的无符号整型必然会发生精度丢失,所以编译器会发出警告。

【热门文章】
【热门文章】