本文采用知识共享 署名-相同方式共享 4.0 国际 许可协议进行许可。
访问 https://creativecommons.org/licenses/by-sa/4.0/ 查看该许可协议。

举例, 0x80000001

    int num = 0x80000001;
    printf("%d", num);
    /*
    * 存进内存过程
    * 1. 转成二进制, **正数符号位不变(负数符号位取反)**
    *    1000 0000 0000 0000 0000 0000 0000 0001
    * 2. 源数据为正数, 正数补码不变, 最后内存中即
    *    1000 0000 0000 0000 0000 0000 0000 0001
    * printf过程
    * 1. 补码
    *    1000 0000 0000 0000 0000 0000 0000 0001
    * 2. 符号位为1, 转反码
    *    1111 1111 1111 1111 1111 1111 1111 1110
    * 3. 符号位为1, 转原码
    *    1111 1111 1111 1111 1111 1111 1111 1111
    * 4. 交给printf, %d是有符号打印, 结果为
    *    -2147483647
    */

总结存储流程:

  1. 把数据转成二进制, 负数最左侧位取反
  2. 根据源数据正负决定是否需要转补码(源数据是否为负数)