//2019/03/04 #include <iostream> int main() { unsigned u1 = 42, u2 = 10; std::cout << u1 - u2 << std::endl; std::cout << u2 - u1 << std::endl; system("pause"); return 0; }
结果:
4294967295 ??
首先,仔细观察输出的结果4294967295,发现4294967295=2^32-1,哦!好像有点规律!
但是,又为啥会是这样?
让我们先来讨论下int和unsigned int的表现形式,他俩都是4个字节,32位的二进制表示,但int有一位是符号位,unsigned则没有。
-1的int类型表示为1000 0000 0000 0000 0000 0000 0000 0001,
那么将其强制转换成unsigned int 应该是1000 0000 0000 0000 0000 0000 0000 0001(红色为符号位),用指数表示是2^31+1,而不是2^32-1!
由于计算机存储的是补码,补码=除符号位,原码取反+1,
即:-1:1000 0000 0000 0000 0000 0000 0000 0001
取反: 1111 1111 1111 1111 1111 1111 1111 1110
加1:1111 1111 1111 1111 1111 1111 1111 1111 = 2^32-1