C语言中的数据类型及其类型转换
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 型中表示数值位,因此这两者所表示的数据范围也有所不同。
类型 | 大小(字节) | 默认有符号/无符号 | 范围 |
---|---|---|---|
char |
1 | 无符号 | 0 到 255 |
unsigned char |
1 | 无符号 | 0 到 255 |
signed char |
1 | 有符号 | -128 到 127 |
short |
2 | 有符号 | -32,768 到 32,767 |
unsigned short |
2 | 无符号 | 0 到 65,535 |
int |
4 | 有符号 | -2,147,483,648 到 2,147,483,647 |
unsigned int |
4 | 无符号 | 0 到 4,294,967,295 |
long |
4/8 | 有符号 | 在32位机器中为 -2,147,483,648 到 2,147,483,647,在64位机器中为 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 |
unsigned long |
4/8 | 无符号 | 在32位机器中为 0 到 4,294,967,295,在64位机器中为 0 到 18,446,744,073,709,551,615 |
C语言中的浮点数(IEEE754标准)
这里有一个需要特别注意的地方,IEEE754中,尾数个位上的1是隐含的
IEEE 的阶码保留了全0和全1来表示特殊的状态,所以阶码最大值的真值为127,对应机器数为
1111 1110
,阶码最小值的真值为-126,对应的机器数为0000 0001
强制类型转换
关于短变长时候的扩展,无符号数使用零扩展,即在高位补0,而有符号数采用符号扩展,正数在高位补0,负数在高位补1。
若同时有无符号数和有符号数参与运算,C语言标准规定按照无符号数进行运算
算数移位和逻辑移位
- 原码的算数移位
- 原码在进行算数移位时,符号位不参与运算,只有数值位移动
- 算数左移时,低位补0,高位舍弃
- 算数右移时,高位补0,低位舍弃
- 补码的算数移位
- 补码在进行算数移位时,符号位也会参与运算
- 正数在进行算数左移时,低位补0,高位舍弃;算数右移时,高位补0,低位舍弃
- 负数在进行算数左移时,低位补0,高位舍弃;算数右移时,高位补1,低位舍弃
可以记忆成,左移并不区分算数左移或者逻辑左移,都是高位直接丢弃(包括符号位),低位补0。而算数右移是将低位丢弃,高位补符号位(最高有效位);逻辑右移是低位丢弃,高位补0