关于计算机中的负数
- 负数在计算机中怎么存储的,都说负数通常使用补码的形式存储
- 我觉得这么说不好理解,站在存储的角度考虑的话数字在内存中都是无符号的,不存在负数的说法
- 只是你想让这块数据用有符号的形式表现出来,所以才出现了负数
- 比如下面a这块数据2147483648用有符号的形式表示就是-2147483648
- 那这是怎么推算出来的呢,就是用补码的方式
- 正数的补码与原码相同,负数的补码为对该数的原码除符号位外各位取反,然后加1
uint32_t a = 0b10000000000000000000000000000000; printf("无符号:%u, 有符号:%d\n", a, a); // 无符号:2147483648, 有符号:-2147483648 uint32_t b = 0b0000000000000000000000000000000; // 第一步 将符号位去掉是这样 uint32_t c = 0b1111111111111111111111111111111; // 第二步 将各个位取反 uint32_t d = 0b10000000000000000000000000000000; // 第三步 再加1就是这样 printf("有符号表现方式:-%u\n", d);
- 具体为什么用补码这种操作形式合适,可能涉及到数据公式推导,具体可以看看《深入理解计算机系统》(CSAPP)第二章中关于补码的描述
本站文章采用知识共享署名 4.0 国际许可协议进行许可。