负数的二进制形式
- 负数的二进制
- 以下内容纯属萌新看法
在学习位运算时,对负数右移让我瞬间就困惑了,对负数的二进制形式都不清楚,本来这是前几天就学习过了的,但我对知识缺乏良好的总结,先将从>>而引起的一系列问题一一解决:
负数的二进制
-15>>3这个表达式的值
首先我们要知道15的二进制(32位)表示为:
0000 0000 0000 0000 0000 0000 0000 1111
-15=~(0000 0000 0000 0000 0000 0000 0000 1111)+1
而按位非~运算符:
按位非运算符“~”是单目运算符。 其功能是将操作数中的二进制位0变成1,1变成0
so
-15=1111 1111 1111 1111 1111 1111 1111 0001
用16进制:0xfffffff1
这样再将-15右移3位就得到了表达式的值fffffffe,即-2
这里可能有点懵,这里得到的是一个16进制,既然正数转换成负数的二进制公式:
负数的二进制形式=~(对应正数的二进制形式)+1
,那反过来我们得到一个负数的二进制形式,将其转换成正数就知道其10进制了,这里为了方便起见,就看后四位
e=14(从a开始为10)
~(1110)+1=0001+1=0010=2
所以就是-2啦,
其实上述牵扯到一个原码,反码,补码的问题,在计算机中,负数以其正值的补码形式表达.这样我就能更好理解这公式的含义了(大一下期学了数字逻辑第一章的内容)
以下内容纯属萌新看法
最高位对应的位为符号位
这句话开始我觉的挺对的,但我想到什么整型的无符号,有符号的,首先得有符号才行吧
当我在一个博客下看到别人评论四位二进制的取值范围为(-8~7)
一开始我站在有符号的情况下去考虑,
1111表达的是-1不是15(二进制形式和二进制数是不一样的,这里是二进制形式)
-8=~(1000)+1=1000
而1001是-7,so最小只能取到-8
7=~(1001)+1=0111最大只能取到7
这样理解是没错,但如果无符号的话取值范围就是0~15了
从这里我也就知道了int范围的由来,之前一直没弄其缘由.
unsigned int和int占的字节长度都是4
第一次写博客,代码啥的都不会搞,之后再好好研究,还有格式啥的都有点乱,