深耕AI
互联网行业 算法研发工程师
概括
本讲主要介绍了C语言中的整数表示。
无符号整数能够表示的最大值比带符号整数要大。带符号整数使用补码来表示,补码的运算系统是一种模运算系统,能够实现加减运算的统一。在C语言中,如果一个表达式中同时包含无符号整数和带符号整数,编译器会将带符号整数强制类型转换为无符号整数进行运算。
在C语言中,整数类型分为无符号整数和带符号整数两类。
无符号整数是一个01序列。
可以按照最低有效位(LSB)和最高有效位(MSB)来描述。
通常在计算机中,我们采用“最高有效位”在最左边,“最低有效位”在最右边的形式来表示无符号整数,与我们日常生活中的十进制表示形式一致。
例如,在一个8位的二进制数中:
- 最高有效位(MSB)是第8位(从左到右,从1开始计数)。
- 最低有效位(LSB)则是第1位。
这种排列方式使得我们可以直观地理解二进制数的权重分布。例如,二进制数 1001
可以解释为:
- 第1位(LSB)权重为 20=120=1,值为
1
。 - 第2位权重为 21=221=2,值为
0
。 - 第3位权重为 22=422=4,值为
0
。 - 第4位(MSB)权重为 23=823=8,值为
1
。
所以这个数的十进制值为 8×1+4×0+2×0+1×1=98×1+4×0+2×0+1×1=9。
这种表示法在计算机体系结构中非常重要,因为它影响了数据存储、传输以及加密解密算法的设计等各个方面。
定点数【定点整数+定点小数】的编码方式有3种:原码,补码,移码。
通常我们用补码表示带符号整数【50年代以来,计算机中的带符号数都用补码表示】。
浮点数中,有两个定点整数,一个是尾数部分,一个是整数部分。
尾数部分:用定点小数表示【原码表示】。
指数部分:用定点整数表示【移码表示】。
问:已知2147483647为2^31-1, C语言中的关系表达式"2147483647U>-2147483647-1"的结果是( )。
答:False。部分分析如下:
有符号二进制数 1000 0000 0000 0000 0000 0000 0000 0000
在有符号整数表示中,最高位是符号位。如果最高位为 1
,则表示该数为负数;如果最高位为 0
,则表示该数为正数。
对于 1000 0000 0000 0000 0000 0000 0000 0000
,最高位为 1
,这意味着它是一个负数。根据补码表示法,这个数表示的是 -2147483648
。
在有符号整数的情况下,32位二进制数 1000 0000 0000 0000 0000 0000 0000 0000
使用的是补码表示法。补码是用来表示有符号整数的一种方式,在这种方法中,最高位(第32位在此例中)是符号位,0
表示正数,1
表示负数。
在补码表示法中,负数的绝对值是通过将所有位取反(除了符号位之外),然后对结果加一得到的。但对于 1000 0000 0000 0000 0000 0000 0000 0000
,取反后仍然是 1000 0000 0000 0000 0000 0000 0000 0000
,因为除了最高位外的所有位都是 0
,取反之后加一还是 1
跟一堆 0
。
因此,这个数表示的是 -2^{31}
,也就是 -2147483648
。
总结:在有符号32位整数中,二进制数 1000 0000 0000 0000 0000 0000 0000 0000
表示的十进制数是 -2147483648
。
这是因为 2^{31}
对应于二进制中的第32位,即 1000 0000 0000 0000 0000 0000 0000 0000
,其值为 2147483648
,而在有符号整数中,这个值表示为 -2147483648
。
无符号二进制数 1000 0000 0000 0000 0000 0000 0000 0000
在无符号整数表示中,所有位都用来表示数值的大小,没有专门的符号位。因此,这个数直接表示其二进制值对应的大小。
对于 1000 0000 0000 0000 0000 0000 0000 0000
,其对应的十进制数为 2^{31}
,即 2147483648
。
总结
- 有符号:
1000 0000 0000 0000 0000 0000 0000 0000
表示-2147483648
。 - 无符号:
1000 0000 0000 0000 0000 0000 0000 0000
表示2147483648
。
int x=-1。请问:
在32位机器上,x为无符号数时,表示的十进制数是多少?x为有符号数时,表示的十进制数又是多少?
解答:
首先将-1转换为2进制数(补码)。为:
1111 1111 1111 1111 1111 1111(32个1)。具体原因是:
对于一个负数的补码表示,可以按照以下步骤进行:
找出该负数的绝对值:比如 -5 的绝对值是 5。
写出该绝对值的原码:假设我们使用 8 位表示,则 5 的二进制表示是 00000101。
对该绝对值的原码取反(按位取反):将 00000101 取反后得到 11111010。
对取反后的结果加 1:11111010 + 1 得到 11111011。
因此,-5 在 8 位二进制中的补码表示就是 11111011。
同理:-1的补码是:1111 1111.
如果这个数是无符号数,那么,它表示的十进制数,就等于:2的32次方-1。
如果这个数是有符号数,那么,由于首位是1,表示负数,其次,将其先减去1,然后各位取反,就得到:
0000 0000 0000 0000 0000 0001。所以,结果是-1。
对于比较两个数,首先要确定两个数的类型,到底时无符号数,还是带符号数。然后才能进行比较。