数据类型
博主个人 《C Primer Plus》 读书笔记,可能不适合参考学习
整数 ( int )
int
当前的各种整数及长度:
| 类型 | 长度( bits ) |
|---|---|
| short | 16 [-32767,32767] / 65535 |
| int | 16/32 [-2147483647, 2147483647] / 4294967295 |
| long | 32 同上 |
| long long | 64 18446744073709551615 |
类型的选择:ISO C 规定的 int 是 16 位的,考虑机器间的差异情况,如无必要则不要用 long 。确实要用 32 位数时,要用 long,以确保对代码对 16 位机器的易移植性。因某些机器使用 16 位硬件寄存器,使用 short 可以提高效率。
short int a; // 可省略 int
int b;
long int c; // 可省略 int
long long int d; // 可省略 int
unsigned short e; // unsigned 可以加到上面每个的前面
整型常量写法:有时需要直接在整型常量中体现出来其长度,这可以通过在数字后面加后缀来实现
| 类型 | Hex | Oct | Digit |
|---|---|---|---|
| char | \0x41 | \0101 | N.A. |
| int | 0x41 | 0101 | 65 |
| unsigned int | 0x41u | 0101u | 65u |
| long | 0x41L | 0101L | 65L |
| unsigned long | 0x41UL | 0101UL | 65UL |
| long long | 0x41LL | 0101LL | 65LL |
| unsigned long long | 0x41ULL | 0101ULL | 65ULL |
printf 打印
| 类型 | 说明符 |
|---|---|
| unsigned int | %u |
| long | %ld,%lx(hex),%lo(oct) |
| unsigned long | %lu |
| short | %hd (打印长数可以实现截断) |
| long long | %lld,%llu(无符号) |
字符 char
使用 char 声明的变量,体积只有 1 Byte 。
字符赋值可以用对字符(要用单引号标记),也可以用对应的 ASCII。如果要赋非打印字符,建议使用转义序列
这里有个比较有趣的东西:一个 char 只有一个 Byte,我们其实可以用一个 4byte 长的 int 直接顺序存 4 个 char,如下
int a='FATE'; // C 中,单引号括起来的单个字符叫字符常量
char b = a;
printf("%c\n", b);
// 控制台输出:E
如上面的演示,直接把 int 赋值给 char 会导致截断
用 char 处理小整数
char 可以用于处理长度为 1 byte 的整数,但需要注意,char 默认有无符号和编译器有关,但 unsigned char 的写法总是有效的。
float、double、long double
float 至少能精确表示小数点后六位数字,取值范围至少为 。
通常 float 共 32 位,其中 8 位是指数值和符号,24 位是非指数部分及其符号
double 长 64 位,值至少有 13 位有效数字。但不同的系统会将这 64 位做不同的分配,有的将多出来的 32 位都用在非指数部分,有的将一部分用在指数部分。
对于 long double,标准 C 只保证该类型至少与 double 精度相同(现在的不少机器中都是 128 位长)
浮点常量写法示例:
-1.56E+12
1.56E12
1.56e12
1.56e-12
.56
.1e-5
156.
对于一个常量,编译器默认会为该常量分配 double 的空间,比如对于 float some = 4.0 * 2.0 ,这里的 4.0 和 2.0 都是按照 double 分配空间,然后将乘积截断为 float ,提高精度的同时会降低速度
与 int 类似,可以通过在常量后面添加后缀的方式,来指示编译器如何处理该对象,如 float some = 4.0F * 2E3F
16 进制浮点常量
如 0xa.1fp10 ,这里的 p 代表后面的值是 2 进制整数
printf 打印
| 格式 | 说明符 |
|---|---|
| 十进制计数法 | %f |
| 指数计数法 | %e |
| 十六进制表示 | %a |
| long double | %Lf, %Le, %La |
上溢 overflow
当赋给浮点数的变量过大时,会自动赋值给该变量一个表示无穷大的特定值, printf 打印结果是 inf 或 infinity 这类表示无穷大的记号。
下溢 underflow
将一个已经不能再减小的浮点数继续减小,为完成操作就只能丢弃原本末尾有效位上的数字,这将导致得到一个比预期要小的值。
sizeof
sizeof 是 C 的内置算符,C99、C11 使用 %zd 说明符在 printf 中占位。