输出无符号应当用%u、%lu等等。
unsigned int 是0-4294967295,你输入的是4294967294,这个是符号整数,0xfffffffe,对应的符号整数就是负2.

虽然你声明的类型是unsigned int,但是列印用的是%d,这个是有符号整数的,如果要列印无符号整数,用%ud。用%d会进行类型转换,相当于(int)(a),0xfffffffe就变成-2了


无论是什么类型的数字,在内存里面都是一串二进位而已。你要给print方法指定列印的类型她才会正常显示哦。而你指定的是有符号整数。


int signedInt = -1;printf("%u
", signedInt);这里列印的就是4294967295了。计算机怎么得到这个数的呢?首先[-1]=[1000 …… 0000 0001]二进位

[-1] + 2^32 = [0000 0000 …… 0000 0000]原 = [1111 1111 …… 1111 1111]反码 = 4294967295

以后有符号的负数转为无符号的,都要先加 2^32 后再取反,就可以与其它数相加了。
最近学了补码,这个问题迎刃而解


推荐阅读:
相关文章