整数在计算机中的表示

本文探讨了计算机中整数的表示,包括无符号整数和有符号数的表示,以及它们之间的转换。在C语言中,无符号整数的最大值取决于位数,有符号数通常使用补码表示。同时,文章还阐述了整数的扩展和截断原理,以及不同整数类型的相互转换规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       整数包含正整数,负整数和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表示二进制比特的位数。那么可以得到,

clip_image002[4]

无符号整数的最大值 clip_image004[4] , clip_image006[4]

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

1.1.2 有符号数的表示

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

clip_image008[4]

clip_image010[4]

从上面的公式可以看出,当xw-1 = 0时,clip_image012[6]所能表示的最大整数是clip_image014[4];当xw-1 = 1时, clip_image012[7]所能表示的最小整数是clip_image016[4]。W比特位的有符号数的值的范围是clip_image018[6]。从这里我们也可以看出,clip_image016[5]没有相反数,对它求绝对值,将会是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)表示有符号数转换为无符号数,

clip_image021

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

clip_image023[4]

1.1.4 整数的扩展

先看一个c语言的实例,

(1)

short sa = -13;

sa的比特位是:clip_image025[4]

int ia = sa;

ia的比特位是:clip_image027[4]

short sa1 = 13;

sa1的比特位是:clip_image029[4]

int ia1 = sa1;

ia1的比特位是:clip_image031[6]

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

(2)

unsigned short usb = 13;

usb的比特位是:clip_image029[5]

unsigned ub = usb;

ub的比特位是:clip_image031[7]

unsigned short usb1 = 65532;

usb1的比特位是:clip_image033[6]

unsigned ub1 = usb1;

ub1的比特位是:clip_image035[4]

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

结论:

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

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

1.1.5 整数的截断

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

(1) 无符号数

unsigned ua = 123456;

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

(123456)10 = clip_image037[4]

由于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 =clip_image039[4]

由于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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值