C语言支持的基本数据类型
[
无符号整数(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位用补码表示的机器上执行,结果是什么? [ 例如,考虑以下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。
编译器处理常量时默认的类型
[
视频链接: