标签:运算 计算机 取值 一个 不用 表示法 字节 符号 计算
一,int类型在内存是如何存储的?
数据类型 占用字节数 取值范围
int 4byte -2^31 ~ 2^31-1
unsigned int 4byte 0 ~2^32
1,占用的比特位数
int占用4个字节,每个字节有8个比特位,所以有32个 0-1 的二进制位数。注意:int类型有正负号,unsigned int 没有正负,所以int要用一位来标识正负
2,符号的表示方法
int类型占用的比特位中,左起第一个位(最高位)就是符号位。0表示正数,1表示负数。其余后面31是数值位。
3,数字0怎么表示?
3.1,因为有了正负数,那么就会有 +0 和 -0 。(注意:0有了两种表示:+0,-0)
+0的表示方法:0000 0000 0000 0000 0000 0000
-0的表示方法:-2^31
0就用 +0 的表示方法
3.2,正数部分 2^31-1 ,之所以要减一,就是因为数字0占用了 +0 。负数不需要表示0,-0 就用来表示 -2^31
3.3,int类型的数字 -1 ,在内存中32个比特位上该如何表示?
10000000 00000000 00000001 左边第一个1表示负号,后面31位表示数值部分“1”。---->然而,并不是这样的
二,补码
计算机中的符号数有三种表示方法:原码,反码,补码。这三种表示方法都有符号位和数值位两部分,符号位用 0 表示正,用1 表示负,但是数值的表示,这三个就不相同了。
1,原码
原码是计算机中一种对数字的二进制定点表示方法。原码表示法 最高位位是符号位,正数最高位是0,负数最高位是1。
如何用原码表示一个数?
-1的表示:10000000 00000000 00000001
+1的表示:00000000 00000000 00000001
为什么不用原码在内存中表示数值呢?
举个栗子:用8位二进制表示 1 和 -1,然后让这两个数做加法运算
十进制 原码
1 0000 0001
-1 1000 0001
结果(原码) 1000 0010
结果(十进制) -2
这运算结果显然不对。计算机在计算时,加法计算的算法更加便捷,减法会先转为负数,再进行加法运算。所以,原码的符号位不能直接参与运算
总结:原码是有符号数的最简单的编码方式,便于输入输出,但是作为代码加减运算时比较复杂。所以计算机不采用这种编码方式存储符号数。
2,反码
规定:正数的反码和原码相同,负数的反码是对其原码逐位取反,但是符号位除外。
正数 和 +0 ,他们的反码就是原码本身。对于8位二进制的 +1,原码,反码都是 0000 0001
负数 和 -0,符号位不变,其余位数逐位取反(1换成0,0换成1),对于8位二进制的-1,原码:1000 0001,反码:11111 1110
我们再来做一次运算:1+(-1)= 0
十进制 原码 反码
1 0000 0001 0000 0001
-1 1000 0001 1111 1110
结果(反码) 1111 1111
结果(原码) 1000 0000
结果(十进制) -2 -0
计算结果是-0,而我们加法运算的结果是0。
问题:由于-0的存在,使得二进制和十进制的互换不是一一对应的关系。这样就需要计算机增加额外的物理硬件配合运算,所以已经抛弃了用反码存储数据
3,补码
补码就是基于反码的 -0 问题而出现的。补码的计算方法:
正数和 +0 的补码是原码,负数
标签:运算 计算机 取值 一个 不用 表示法 字节 符号 计算
原文地址:https://www.cnblogs.com/inspred/p/10987936.html