基本类型
1. C 语言的变量类型
1. 基本类型
整数类型
浮点类型
2. 构造类型
数组
结构体
共用体(联合)
3. 指针
4. 空类型(void)
2. 整数类型的宽度
1. char 8bit 1字节 0 ~ 0xFF
2. short 16bit 2字节 0 ~ 0xFFFF
3. int 32bit 4字节 0 ~ 0xFFFFFFFF
4. long 32bit 4字节 0 ~ 0xFFFFFFFF
5. float 32bit 4字节 0 ~ 0xFFFFFFFF
6. double 64bit 8字节 0 ~ 0xFFFFFFFFFFFFFFFF
3. 溢出
char y = 0x100 // 0001 0000 0000,高位丢弃 0000 0000
4. 有符号、无符号
- 二者的区别
- 在存储和赋值的时候没有任何差异
- 拓展的时候有区别
- 比较的时候有区别
unsigned char x = 0 ~ FF = 0 - 255
char x:
x > 0: 0 ~ 127
x < 0: -128 ~ -1
拓展的时候:
举例1:
int x = -1; // 默认是有符号的
print("%u\n", x); // 以无符号形式打印:429,496,7295 / 0xFFFFFFFF
print("%d\n", x); // 以有符号形式打印:-1
举例2:
unsigned int y = 0xFFFFFFFF;
print("%d\n", y); // 以有符号形式打印:-1
举例3:
signed char x = -1(有符号,还是负数); // 0xFF,11111111
int y = x;
解析: 0000 0000 0000 0000 0000 0000 0000 0000
放进去: 0000 0000 0000 0000 0000 0000 1111 1111
有符号: 1111 1111 1111 1111 1111 1111 1111 1111 (最终存储)
signed char x = 127(有符号,但是正数); // 0x7F, 0111 1111
int y = x;
解析: 0000 0000 0000 0000 0000 0000 0000 0000
放进去: 0000 0000 0000 0000 0000 0000 0111 1111
正数: 0000 0000 0000 0000 0000 0000 0111 1111 (最终存储)
举例4:
unsigned char x = -1; // 0xFF,11111111
int y = x;
解析: 0000 0000 0000 0000 0000 0000 0000 0000
放进去: 0000 0000 0000 0000 0000 0000 1111 1111
无符号: 0000 0000 0000 0000 0000 0000 1111 1111 (最终存储) = 255
比较的时候:
举例1:
char x = -1;
char y = 1;
if (x > y) ... // -1 > 1 错误
举例2:
unsigned char x = -1; // 0xFF,因为是无符号会被看成是255
unsigned char y = 1; // 0x01
if (x > y) ... // 255 > 1 正确
5. 浮点类型
IEEE 754 标准的简要概述: float 类型:通常称为单精度浮点数,使用 32 位(4 字节)来存储。 符号位:1 位 指数位:8 位 尾数(或称为有效数字)位:23 位 double 类型:通常称为双精度浮点数,使用 64 位(8 字节)来存储。 符号位:1 位 指数位:11 位 尾数位:52 位
换算:指数部分/2, 小数部分*2
- float(IEEE 规范) 31 30(符号位)--------(指数部分 8 位)22---------0(尾数部分 23 位)
- double(IEEE 规范) 63 62(符号位)--------(指数部分 11 位)51---------0(尾数部分 52 位)
3: float a = 12.5f;
00401028 mov dword ptr [ebp-4],41480000h
4: double b = 2.0;
0040102F mov dword ptr [ebp-0Ch],0
00401036 mov dword ptr [ebp-8],40000000h
将十六进制的41480000h转换为二进制为01000001100100000000000000000000。在IEEE 754标准的单精度浮点数中:
第1位(最左边的位)为符号位,0表示正数。
接下来的8位为指数位,10000011,转换为十进制为131。根据IEEE 754标准,真实的指数值需要减去偏移量127,即131 - 127 = 4。
剩余的23位为尾数(分数)位,00100000000000000000000。在尾数的隐含前导位(即默认的1)后追加这些尾数位,得到1.001的二进制数,转换为十进制即1 + 0.5 = 1.5。
最后,将尾数1.5乘以2的指数4次方,得到1.5 * 2^4 = 12.5