C语言中的整数数据类型
C 语言中的整型数据就是定点整数,根据位数的不同,可分为字符型 (char,8 位)、短整型(short 或 short int,16 位)、整型 (int,32 位)、长整型 (long 或 long int,在32 位机器中为 32位,在 64 位机器中为 64 位)。char 是整型数据中比较特殊的一种,其他如 short/int/long 等不指定signed/unsigned 时都默认是有符号整数,但 char 默认是无符号整数。无符号整数 (unsigned short/int/long)的全部二进制位均为数值位,没有符号位,相当于数的绝对值。signed/unsigned 整型数据都是按补码形式存储的,只是 signed 型的最高位代表符号位,而在unsigned 型中表示数值位,因此这两者所表示的数据范围也有所不同。
有符号数与无符号数的转换
等长的强制类型转换的结果是保持位值不变,只是改变了解释这些位的方式。
有符号数转换为等长的无符号数时,符号位解释为数值的一部分,负数转换为无符号数时数值将发生变化。同理,无符号数转换为有符号数时最高位解释为符号位,也可能发生数值的变化
若同时有无符号数和有符号数参与运算,C语言标准规定按照无符号数进行运算
不同字长整数之间的转换
当大字长变量向小字长变量强制类型转换时,系统把多余的高位部分直接截断,低位部分直接赋值。
由本例可知,小字长到大字长的转换时,不仅要使相应的位值相等,还要对高位部分进行扩展。若原数字是无符号整数,则进行零扩展,扩展后的高位部分用 0 填充。否则进行符号扩展,扩展后的高位部分用原数字符号位填充。其实两种方式扩展的高位部分都可理解为原数字的符号位。小字长向大字长的转换,在位值相等的条件下还要补充高位的符号位,可以理解为数值的相等。注意,char 型为8位无符号整数,其在转换为 int 型时高位补0即可