本文采用知识共享 署名-相同方式共享 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
*/
总结存储流程:
- 把数据转成二进制, 负数最左侧位取反
- 根据源数据正负决定是否需要转补码(源数据是否为负数)