在计算机中数据以二进制存储
位bit 0/1 bety字节 8bit Word(字) (intel中16bit) Dword (双字) Qword (四字) Tbyte (十字节)
真值:-111 //以十进制数 -111为例 短除法求其他进制: 111 ÷ 2 = 55 …… 1; 55 ÷ 2 = 27 …… 1; 27 ÷ 2 = 13 …… 1; 13 ÷ 2 = 6 …… 1; 6 ÷ 2 = 3 …… 0; 3 ÷ 2 = 1 …… 1; 1 ÷ 2 = 0 …… 1; //从下往上写11101111; 转十进制可以使用加权法: 1*2^0 + 1*2^1 +1*2^2 + 1*2^3 + 0*2^4 + 1*2^5 + 1*2^6 + 1*2^7 = 111 熟练后可以 0000 0000 //正负 64 32 16 8 4 2 0 原码:11101111; //以二进制表示 最高位 1 表示 负;0 表示 正; 反码:10010000; //除了最高位 1变0 0变1; 补码:10010001。 //在反码的基础上+1;
//如果是正数,那么原码反码补码都是原码;
需要注意的是在计算机中数值全部以补码来存储
例如: unsigned char; 无符号,1字节,取值范围0~2^8-1,即2^8个数; char 取值范围为-2^7~2^7-1(-128~127); 1000 0000 表示的是-128; 0000 0000 表示的是0;
计算机不会做减法例如 -128-3 == -127 + (-1)
-127 = 1111 1111;补码:1000 0001; -1 = 1000 0001;补码:1111 1111; 补码相加:1 1000 0000; 再转化为原码:1000 0000(-128);
位运算:
printf("%d",1 & 2); //0001(补码) & 0010(补码) = 0000(补码) = 0000(原码) = 0; printf("%d",1 | -2); //0001(补码) | 1110(补码) = 1111(补码) = 1001(原码) = -1; printf("%d",1 >> 2); //0001(补码)去掉右边两位,左边补两个0 = 0000(原码) = 0; printf("%d",-1 << 2); //1111(补码)去掉左边两位,右边补两个0 = 1100(原码) = -4; printf("%d", ~2); //~按位取反运算符 优先级高于>>右移位运算符; 0010(补码) ~(包括符号位一起取反) 1101(补码) = 1011(原码) = -3; printf("%d",1 ^ 2); //相同为0不同为1:0001(补码) ^ 0010(补码) = 0011(原码) = 3;
//如果是左移,则规定补入的数全部是0;如果是右移,还与被移位的数据是否带符号有关。若是不带符号数,则补入的数全部为0;若是带符号数,则补入的数全部等于原数的最左端位上的原数(即原符号位)
原文:https://www.cnblogs.com/hyby/p/13668698.html