7.负数转换无符号unsigned

//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

猜你喜欢

转载自www.cnblogs.com/foremember/p/10472515.html