在计算机中,数值一律用补码表示。
先来看一个例子
为方便以8位正数举例
int a=1
此时a的原码: 00000001 (直接取二进制,正数的符号位为0,不足的地方补0)
反码 01111110(除符号位外对原码按位取反)
补码 00000001 (反码最右边+1即为补码)
现在可以看到正数的补码和原码相同
int b=-1
此时先取b的原码: 100000001 (直接取二进制,负数的符号位为1,不足的地方补0)
111111110 (除符号位以外对原码按位取反)
111111111 (反码最右边+1即为补码)
关于有符号数的移位:
正数(原)的编码从第一到第三十二依次右移,再在最最前端补0
负数(补)的编码从第一到第三十二依次右移,再在最最前端补1
左移都是在末尾补0。
关于无符号数的移位:
可视为与有符号的正数移位行为一致。
严格来说:有一个逻辑移位与算数移位的概念
PS:数值的二进制表示形式在windows上可用itoa来看。
int p=1;
char str[260] = { 0x00 };
_itoa(p, str, 2);