今天在看C语言位操作时遇见忘记的地方,向右移位时左边的二进制位补0或补1(正数补0,负数补1),在转换负数时有些看不懂负数的二进制,于是复习了负数转二进制的方法。
1、十进制负数转为二进制
在二进制总负数以原码的补码形式表达,而正数的补码与原码相同,负数的补码在其反码后+1
这个时候有需要知道反码的概念:正数的反码是所有位取反,而负数的反码的除符号位所有位取反
5在二进制中表示为0b0000 0101,
其反码——0b1111 1010
-5则为 0b1111 1010 +0000 0001=0b1111 1011
我们再以计算机为例,一个int类型的数-1
其在计算机中为4个字节,32位。
①-1的原码:10000000 00000000 00000000 00000001
②-1的反码:11111111 11111111 11111111 11111110
③-1的补码:11111111 11111111 11111111 11111111
从以上例子中可以看出,-1在计算器中就是全1
而在嵌入式中常用的0XFF=1111 1111 =255,这8位二进制数一般用作和其他数向与,用来保留低八位数据。关于这个应用,后续在项目开发环节遇到了在去仔细研究。
2、符号位为1的十进制数转二进制
①除去符号位减1;没有符号位就不要除啦
②除去符号位,按位取反,其结果就是负数的源码;
③再将源码转成相应的十进制。
0b11111 1011 ->0b1111 1010 -> 0b0000 0101=-5