整数的⽆符号编码和有符号编码
单个的位没有实际意义,加上解释才有实际意义.我们可以把位组合在⼀起,并且加上解释以此赋予它意义.
⽆符号编码表⽰的数x>=0
有符号编码表⽰的数min<=xandx<=max
当我们对数字的运算超出编码所能表⽰的范围就叫做溢出.
⼤多数计算机使⽤8位的块(字节)作为最⼩的可寻址单位.机器级程序将内存视为⾮常⼤的数组,称为虚拟内存.内存中的每⼀个字节都由唯⼀的数字来标识.称为它的地址.
所有地址的集合即为虚拟地址空间.所以,对于32位的机器,虚拟地址空间地址范围为0~0x8FFFFFFF-1,从0开始,需要减去1.
1.⼆进制转16进制
数学原理:2^0+2^1+2^2+2^3=15
在16进制中我们使⽤A~F来表⽰10,11,12,13,14,15,0~9不变.
由此,对⼀个⼆进制序列,我们只要从低位开始,每四个位取⼀个16进制数.如下.
0的16进制表⽰法为0xF18
如果最后⼀次取数的⼆进制序列少于4位,⾼位补0,如下
1100011000的16进制表⽰法为0x318
特别当x=2^n次⽅时,转16进制⽅法如下.
因为有16进制的0代表4个⼆进制位.所以n=i+4j.i=0,1,2,3,16进制表⽰法为0x(2^i)(j个0)
⽐如⼆进制序列1000000是2^6,6=2+1*4,16进制表⽰法为0x40
2.16进制转⼆进制
每⼀个16进制数,写成4个⼆进制位
⽐如.0x7F01111111
对于⼀个多字节的程序对象,必须建⽴俩个规则,对象的地址是什么,内存中如何排列这些字节,假设4字节int变量0x7FFFFFFF存储是连续的,
有俩种排列⽅式.
1.低位在前
0x00int的第⼀个字节FF
0x01int的第⼆个字节FF
0x02int的第三个字节FF
0x03int的第四个字节7F
2.⾼位在前
0x00int的第四个字节7F
0x01int的第三个字节FF
0x02int的第⼆个字节FF
0x03int的第⼀个字节FF
由此我们导出俩种程序对象在内存中排列的⽅式,⼤端法,⼩端法
1.有效的低字节在前,⼩端法
2.有效的⾼字节在前.⼤端法
影响到三个⽅⾯.
1.跨主机传送数据,⽐如从使⽤⼤端排列的机器传输字节到⼩端排列的机器.如下,假设要传送的数据是4个字节的int数字,0x7FFFFFFF(⼈的书写形式),即2147483647
⼤端机器的操作如下,将此int的四个字节,存⼊到⼀个bye[4]的数组内.[7F,FF,FF,FF,FF,FF,FF],
⼩端机器接受到数据如下.[7F,FF,FF,FF,FF,FF,FF],那么⼩端机器认为低字节在前,即传输过来的数字为0xFFFFFFF7F.
2.阅读表⽰整数数据的字节序列时字节顺序也很重要.如下,考虑到反汇编代码
0105430b2000,这个是我们的书写顺序.
⼩端机器解释的顺序为00200b430501
⼤端机器解释的顺序为0105430b2000
3.编写规避正常类型系统的程序时,⽐如C⾥⾯的强制转换和union
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
⽆符号数编码和有符号整数补码编码
设⼀个⼆进制序列[x
w-1.........
x
0
]
⽆符号编码,最⾼位为负权,即符号位:
X1=x
w-1
*2w-1+..........+x
0
*20
有符号补码编码为:
X2=-x
w-1
*2w-1+x
w-2
*2w-2+......................+x
0
*20
由以上俩个数学公式,可以导出有符号补码编码整数转⽆符号编码整数公式
X2-X1=-x
w-1
*2w-1-x
w-1
*2w-1=-x
w-1
*2w
即X1=X2+x
w-1
*2wX2=X1-x
w-1
*2w
设,w=4,考虑如下⼀个⼆进制序列[1011]
它的⽆符号整数为8+2+1=11,有符号整数为-8+3=-5,
有-5=11-1*2^4=11-16=-5
有11=-5+2^4=-5+16=11
对俩个整数相加溢出,即超出编码能容纳的范围,
⽆符号数加法
x+y=x+y或者x+y-2w(即溢出位舍弃),考虑如下代码
#include
#include
usingnamespacestd;
intmain()
{
cout<
}
运⾏结果为0.原理如下
0xFFFFFFFF+1=0x100000000,溢出舍弃,即0x00000000=0x100000000-2^32=2^32-2^32
有符号数补码加法
x+y=x+y或者x+y-2w(正溢出,整数相加变成负数)或者x+y+2w(负数相加变成整数)
intmain()
{
cout<
cout<
}
INT32_MAX是0x7FFFFFFF+1=0x80000000-0x100000000(2^32)=0x80000000,第⼆⾏同理
本文发布于:2022-11-12 17:31:22,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/88/5688.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |