为何给unsigned int赋值负数编译器不报错?附代码示例
为啥给unsigned int赋值负数编译器不报错?还输出-1?
嘿,这个问题其实挺容易绕晕人的,我来给你唠明白,保证不用复杂术语也能懂!
先看你的代码:
#include <stdio.h> int main() { unsigned int a=-1; printf("Result :%d",a); return 0; }
第一部分:编译器为啥不报错?
C语言的规则里,允许把有符号数赋值给无符号数,这属于合法的「隐式类型转换」,不是语法错误,所以编译器不会直接报错(除非你开了特别严格的警告开关,它会给你提个醒,但不会阻止编译)。
说白了,编译器默认你是故意这么干的,它会自动帮你把负数转换成无符号数能接受的形式。
第二部分:负数到底变成了啥?
以-1为例,在计算机里负数是用「补码」存储的。假设我们用32位的整数:
- -1的补码是 全1的二进制(也就是
0xFFFFFFFF)。 - 当你把它赋值给
unsigned int时,编译器直接把这个全1的二进制当成无符号数来读,那这个数就是4294967295(32位无符号数的最大值)。
第三部分:为啥printf输出-1?
这是因为你用错了printf的格式符!
%d是用来输出**有符号整数(int)**的,而你传给它的是unsigned int类型的a。- printf不管你传的是什么类型,它只会按照
%d的要求,把a的二进制值(还是全1)当成int的补码来解析。 - 而在int的规则里,全1的补码正好对应-1,所以就输出了-1。
要是你把格式符换成%u(专门输出无符号整数),运行结果就会变成4294967295了,不信你试试!
内容的提问来源于stack exchange,提问作者Ganesh
相关产品推荐
相关产品推荐

