C语言支持的基本数据类型

[

](http://www.wjgbaby.com/wp-content/uploads/2018/05/18050507-300x192.png)
](http://www.wjgbaby.com/wp-content/uploads/2018/05/18050507-300x192.png)

无符号整数(Unsigned integer)

• 机器中字的位排列顺序有两种方式:(例:32位字: 0…010112) – 高到低位从左到右:0000 0000 0000 0000 0000 0000 0000 1011 – 高到低位从右到左:1101 0000 0000 0000 0000 0000 0000 0000 – Leftmost 和rightmost 这两个词有歧义, 故用LSB(LeastSignificant Bit)来表示最低有效位,用MSB来表示最高有效位 – 高位到低位多采用从左往右排列 • 一般在全部是正数运算且不出现负值结果的场合下,可使用无符号数表示。例如,地址运算,编号表示,等等 • 无符号整数的编码中没有符号位 • 能表示的最大值大于位数相同的带符号整数的最大值(Why?) – 例如,8位无符号整数最大是255(1111 1111) 而8位带符号整数最大为127(0111 1111) • 总是整数,所以很多时候就简称为“无符号数”

带符号整数(Signed integer)

• 计算机必须能处理正数(positive) 和负数(negative),用MSB表示数符(0–正数,1–负数) • 有三种定点编码方式 – Signed and magnitude (原码) 定点小数,用来表示浮点数的尾数 – Excess (biased) notion (移码) 定点整数,用于表示浮点数的阶(指数) – Two’s complement (补码) 50年代以来,所有计算机都用补码来表示带符号整数 • 为什么用补码表示带符号整数? – 补码运算系统是模运算系统,加、减运算统一 – 数0的表示唯一,方便使用 – 比原码多表示一个最小负数

C语言程序中的整数

无符号数:unsigned int ( short / long);带符号整数: int ( short / long) 常在一个数的后面加一个“u”或“U”表示无符号数 若同时有无符号和带符号整数,则C编译器将带符号整数强制转换为无符号数 假定以下关系表达式在32位用补码表示的机器上执行,结果是什么? [

](http://www.wjgbaby.com/wp-content/uploads/2018/05/18050508-300x147.png)
](http://www.wjgbaby.com/wp-content/uploads/2018/05/18050508-300x147.png)
例如,考虑以下C代码:

int x = –1;
unsigned u = 2147483648;

printf ( “x = %u = %d\n”, x, x);
printf ( “u = %u = %d\n”, u, u);

在32位机器上运行上述代码时,它的输出结果是什么?为什么? x = 4294967295 = –1 u = 2147483648 = –2147483648 因为–1的补码整数表示为“11…1”,作为32位无符号数解释时,其值为232–1= 4 294 967 296–1 = 4 294 967 295。 231的无符号数表示为“100…0”,被解释为32位带符号整数时,其值为最小负数:–232-1 = –231 = –2 147 483 648。

编译器处理常量时默认的类型

[

](http://www.wjgbaby.com/wp-content/uploads/2018/05/18050509-300x186.png)](http://www.wjgbaby.com/wp-content/uploads/2018/05/18050509.png) 1)在有些32位系统上,C表达式-2147483648 < 2147483647的执行结果为false。Why? 2)若定义变量“int i=-2147483648;”,则“i < 2147483647”的执行结果为true。Why? 3)如果将表达式写成“-2147483647-1 < 2147483647”,则结果会怎样呢?Why? [![](http://www.wjgbaby.com/wp-content/uploads/2018/05/18050510-300x113.png)
](http://www.wjgbaby.com/wp-content/uploads/2018/05/18050509-300x186.png)](http://www.wjgbaby.com/wp-content/uploads/2018/05/18050509.png) 1)在有些32位系统上,C表达式-2147483648 < 2147483647的执行结果为false。Why? 2)若定义变量“int i=-2147483648;”,则“i < 2147483647”的执行结果为true。Why? 3)如果将表达式写成“-2147483647-1 < 2147483647”,则结果会怎样呢?Why? [![](http://www.wjgbaby.com/wp-content/uploads/2018/05/18050510-300x113.png)

视频链接:

计算机系统基础(一):程序的表示,转换与链接

计算机系统基础(二):程序的执行和存储访问

计算机系统基础(三):异常、中断和输入/输出