转载:整数在计算机中的表示

原始链接:https://blog.csdn.net/hengshan/article/details/6462289

 

 

整数在计算机中的表示

hengshan 2011-06-02 21:07:00  7933  收藏
文章标签: 扩展 语言 c
版权
       整数包含正整数,负整数和0。从数学的角度来讲,整数是无穷无尽、列举不完的,整数的大小是没有限制的。但是,如果用计算机来表示整数,则不然。因为计算机是靠数字信号来表示数,计算机所能处理的整数的长度也是由计算机的字长来决定的。这样一来,必须制定一个规则来表示整数。

      下来我们以C语言中的整数表示,展开学习。在c语言中有 char,unsigned char,short int,unsigned short int,long,unsigned long。这些类型不仅有“有符号”和“无符号”之分,而且有长度之分。

1.1.1 无符号整数(unsigned int)的表示
       上面说了,整数在计算机中,都是以二进制比特位表示的。例如,对于一个w位的无符号整数,用二进制比特位可以表示为[xw-1 , xw-2 , … , x2 , x1 , x0],如果我们用B2Uw(x)来表示这个整数,其中B表示是binary,U表示是unsigned,w表示二进制比特的位数。那么可以得到,

无符号整数的最大值  , 。

例如:对于16位无符号整数,能表示的范围是 0 ~ 65535。

1.1.2 有符号数的表示
        目前的计算机系统大都采用补码(two’s complement)来表示有符号数的。例如,对于一个w位的整数,用二进制比特位可以表示为[xw-1 , xw-2 , … , x2 , x1 , x0],那么比特位 xw-1就是符号位,如果值是0表示正整数,如果值是1则表示负整数。B2Tw(x)来表示整数,则有

从上面的公式可以看出,当xw-1 = 0时,所能表示的最大整数是;当xw-1 = 1时, 所能表示的最小整数是。W比特位的有符号数的值的范围是。从这里我们也可以看出,没有相反数,对它求绝对值,将会是0。

1.1.3 有符号数和无符号数的转换
在c语言中,如果我们写出如下的代码:

(1)

short sx = -1;

unsigned short ux = sx;// 此时 ux的值是 65535

比特位:1111111111111111

(2)

unsigned short uy = 65534;

short sy = uy; //此时 sy 的值是-2

比特位:1111111111111110

(3)

unsigned short uz = 28;

short sz = uz; // 此时,sz也等于28

比特位:0000000000011100

在算计机中,相同比特位可以解释为“有符号数”和“无符号数”,也就是可以相互转换的“有符号数”和“无符号数”他们的二进制表示是一样的,唯一不同的就是人们给他们了不同的解释。

用公式表示U2Tw(x)表示有符号数转换为无符号数,

用公式表示T2Uw(x)表示无符号数转换为有符号数,

1.1.4 整数的扩展
先看一个c语言的实例,

(1)

short sa = -13;

sa的比特位是:

int ia = sa;

ia的比特位是:

short sa1 = 13;

sa1的比特位是:

int ia1 = sa1;

ia1的比特位是:

总结:可以看出short到int的转换就是最高有效位向高位扩展了。

(2)

unsigned short usb = 13;

usb的比特位是:

unsigned ub = usb;

ub的比特位是:


unsigned short usb1 = 65532;

usb1的比特位是:

unsigned ub1 = usb1;

ub1的比特位是:

总结:可以看出unsigned short到unsigned int的转换就是0向高位扩展了。

结论:

1、对于有符号整数,短类型向长类型转换,位模式采用符号扩展

2、对于无符号整数,短类型向长类型转换,位模式采用0扩展

1.1.5 整数的截断
上一节介绍了长度较短的整数向长度较长的整数扩展机制。那么当长度较长的整数向长度较短的整数转换时,是啥样子呢?

(1) 无符号数

unsigned ua = 123456;

unsigned short usa = ua;//此时usa等于多少呢?

(123456)10 = 

由于unsigned short是16位长,unsigned 是32位长,所以unsigned

向unsigned short转换,只能将高16位截断,留下低16位。相当于是模数为216 模运算。即,usa = ua % 216 = (1110001001000000)2

总结:对于比特位为w位的无符号整数x , 转换为比特位为k位的无符号整数x’ , 其中k < w。那么 x’= x % 2k ,通俗的讲,就是将高位的w-k位截掉。

(2) 有符号数

int ia = -2128464810;

short sa = ia;//此时ia等于多少呢?

(-2128464810)10 =

由于short是16位长,int 是32位长,而我们只能用16位来表示,该怎么办呢?

办法是:

1、先对(-2128464810)10 和模数216 进行模运算(注意,曾经介绍过,c++中有符号整数的模运算的结果的符号类型和被除数的保持一致)。所以,(-2128464810)10 % 216 = -52138

2、将余数-52138转换为比特位是16的无符号数,即13398

3、将无符号数13398转换为有符号数,他自身13398

总结:对于比特位为w位的符号整数x , 转换为比特位为k位的符号整数x’ , 其中k < w,过程如下:

1、求出 x % 2k , 结果记作r

2、将r转换为比特位为k的无符号数

3、将2中的结果转换为比特位为k的有符号数,即x’
————————————————
版权声明:本文为CSDN博主「hengshan」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hengshan/article/details/6462289

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值