|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
1.负数的存放 计算机存放负数是以补码的形式存放的
我们要知道补码是怎么来的,就要先了解源码和反码
一个数的源码就是这个数的二进制形式 例如 5 的源码就是 0000 0101
而反码就是 对 源码 按位取反 例如 5 的反码就是 1111 1010
补码就是在反码的基础上加1得来的 例如 -5 的反码就是 1111 1011
由此结论知道一个负数的补码,想求这个数是多少就是: 补码 先减去 1 ,在进行按位取反,就得到这个数了。
其实我也是刚刚才知道的,以前拿补码是这样算的:补码取反之后的结果再加1 ,但是我这样的算结果偏偏是对的
但是这样使得我对负数转成补码老是有疑惑,这是说出来是想提醒一下如果也有和我一样这样计算补码的朋友,请
快点更正过来,不能这样去划算。
2.有符号和无符号的运算
其实我刚开始也非常困惑的,不知道两个数相加计算机到底是以无符号的形式计算,还是以有符号的形式进行计算
现在我终于也算是搞清楚了,也是糊里糊涂的就一下子就明了了,下面我就将我对有符号和无符号的理解分享出来
这里要注意一点的就是 85H 这个数据,现在只是16进制形式表示的,它既能表示十进制的 +138 或 -123,搞清楚
这里就好办了,我主要是围绕 当85H 为负数-123 和 正数 +133 ,计算的结果是多少,而 5H 他只能表示正数
我现在就举一个例子,比如: 85H + 5H =8AH,现在我们就是cpu,记住cpu是不知道 数据是有符号还是无符号
我们先分析这两个数的 二进制形式是多少 ,转换之后是:1000 0101 + 0000 0101 = 1000 1010,转换的目的
是为了让大家看明白如果这2个数是有符号,计算的结果会不会出错。 现在我是程序员,我要进行的是无符号数
运算,因为无符号数据,不需要考虑符号,所以 1000 0101 = 135,0000 0101 = 5 , 1000 1010 = 138
刚好 135 加上 5 是等于 138 。好无符号计算先说到这里,等分析完了有符号计算在来比较一下就清楚明了了
现在我觉得吧这个数据当成有符号数了,因为是有符号计算要考虑到符号位,这里提醒一下,如果是8位运算那就看
第8位,16位计算就看第 16 位,这里 1000 0101 这个数据,第8位是 1 那就说明这个数是负数的补码形式存放的
负数的存放的相信大家还记得吧。所以 1000 0101 = -123,而 0000 0101 最高位是0表示正数,正数是以源码
存放的所以 0000 0101 = 5,而结果 1000 1010 最高位是1 表示负数,将补码 1000 1010 转换之后就变成了 -118
而 -123 加上 5 刚好等于 -118。 我相信我讲到这里,大家应该很容易就看出来了为什么说 无符号 和有 符号是根据
我们程序员来的,我们认为他是无符号他就是无符号,认为有符号就是有符号。
对于无符号和有符号的表示形式,如果还是有不理解的可以看下下面我拷贝的小知识
虽然一直用C/C++,但很少涉及到Bit序列的问题。比如,-1的二进制表示到底是怎样的?
从没有深究过,一直都是模棱两可的,说出来实在让人笑话。
对于有符号整型数的简单认识就是,最高位为符号位,0为正,1为负,那么剩下几位应该如何表示呢?
理所当然的认为,既然是1表示为0000 0001(假设为8位整型数,下同),那么-1就应该表示为1000 0001了。
但是,在C语言里,-1的正确表示应该是1111 1111,即0xFF。因为C语言里,对整型数是
采用Two’s complement表示法,而前面我的理解则是Sign-Magnitude表示法(浮点数采用该法)。
在Two’s complement表示法里,1000 0001表示的是-127。
几个特殊值,比如:正值的最大表示为0111 1111,即127。负值的最小表示为1000 0000,即-128。
|
评分
-
查看全部评分
|