首页 > 试题

整数符号

更新时间:2022-11-12 17:31:22 阅读: 评论:0

山西太原全托班-周长的计算公式


2022年11月12日发(作者:支付宝现重大漏洞)

整数的⽆符号编码和有符号编码

单个的位没有实际意义,加上解释才有实际意义.我们可以把位组合在⼀起,并且加上解释以此赋予它意义.

⽆符号编码表⽰的数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小时内删除。

上一篇:r表示什么
下一篇:create名词
标签:整数符号
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图