原始链接: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