玩命加载中 . . .

2.2-整数的表示


2.2 整数的表示

2.2.1 数据类型

不同数据类型的数值范围

  • 在64位机器上,long占8个字节
  • 在32位机器上,long占4个字节

补码

负数是用补码表示的

补码最高位的权重是负的,所以称为符号位

最高位是灰色的负权重,所以最高位为1,就相当于减去8

例如:-5表示为-8+3,所以符号位是1,非符号位是011,即-5的补码表示为1011

2.2.2 有符号数和无符号数

#include <stdio.h>

int main(int argc, char const *argv[])
{
    short a = -12345;
    unsigned short b = (unsigned short)a;
    printf("a = %d, b = %u", a, b);
    return 0;
}
// a = -12345, b = 53191

ab的位模式其实是一样的,都是1100 1111 1100 0111,但是解释这些位的方式不同

对于相同的位模式,有符号数和无符号数的转换关系为

所以

  • 当最高位$x_{w-1}$为1时,此时有符号数$x$表示一个负数,要转换为无符号数需要加上$2^w$
  • 当最高位为0时,有符号数和无符号数是相等的

无符号数到有符号数的转换

所以

  • 最高位等于0时,无符号数可以表示的数值小于有符号数的最大值,此时转换后的数值不变
  • 最高位等于1时,无符号数可以表示的数值大于有符号数的最大值,转换后得到的有符号数等于该无符号数减去$2^{w}$

例如:无符号数11D = 1011B,转换为有符号数应该是$11-2^4=-5$

C语言中,执行运算时,如果一个运算数是有符号数,另一个运算数是无符号数,会将有符号数隐式转换为无符号数来执行运算

2.2.3 数据类型转换

数据扩展

  • 无符号数的扩展高位补0
  • 有符号数的扩展进行符号位扩展,最高位为0就扩展0,为1就扩展1

数据截断

对于十进制123456,从中间截断得到456,就相当于将原数对1000取模,也就是对$10^3$取模

同理,将二进制数11001010对$2^4$取模,就得到了1010


文章作者: kunpeng
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 kunpeng !
  目录