main( ){
char
c=
040
;
printf(“%o
",c<<
1
);
}
按照上面的运算规则,我们先将12转换为二进制,为1100,进行位逻辑反运算,则为0011,化为十进制数结果应为3才对啊,那为什么测试的结果是-13呢?
原来啊,在计算机中,二进制的存储方式是以补码的形式存储的。
所以,12在计算机内存储的是01100(第一个0位符号位,代表这个数是正数),对其进行逻辑反运算则为10011,但这个二进制只是b这个变量在计算机内的存储形式(即b的补码形式),所以我们需要将其转换为原码形式,由于符号位为1,为负数,所以我们先对10011转换为反码,即11100,再对其进行+1,所以结果为11101,转换为十进制数则为-13。所以b=-13。
计算机中打印的二进制都是补码的形式
正数原码、反码、补码 三码合一
负数的原码转换为补码为 符号位不变 数值位按位取反 末位加一
负数,补码的补码等于原码 反码为正 三码合一
(5)右移操作运算规则:左边空出的位用0或者1填补。正数用0填补,负数用1填补。注:不同的环境填补方式可能不同;低位右移溢出则舍弃该位。
a=127,转换为二进制为01111111,由于二进制在计算机内部是以补码的形式进行存储,但由于127是正数,所以其补码为01111111,对该补码进行右移操作运算,按照运算规则,得到00011111,转换为原码,依旧为00011111,转换为十进制数为31,所以,b=31。
a=-127,转换为二进制为1000 0111 1111,转换为反码为1111 1000 0000,转换为补码是1111 1000 0001,对其进行左移三位的操作,得到:1100 0000 1000,将其转换为反码:1100 0000 0111,再将其转换为原码:1011 1111 1000,转换为十进制数,为-1016,所以b=-1016。
对多组数据进行测试,我们可以得到这样一个规律:
当一个数进行n位的左移操作后,所得到的新的数=被操作数*2^n.