C 语言学习笔记1:数据类型

453 阅读4分钟

数据类型

博主个人 《C Primer Plus》 读书笔记,可能不适合参考学习

整数 ( int )

int

当前的各种整数及长度:

类型长度( bits )
short16 [-32767,32767] / 65535
int16/32 [-2147483647, 2147483647] / 4294967295
long32 同上
long long64 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 可以加到上面每个的前面

整型常量写法:有时需要直接在整型常量中体现出来其长度,这可以通过在数字后面加后缀来实现

类型HexOctDigit
char\0x41\0101N.A.
int0x41010165
unsigned int0x41u0101u65u
long0x41L0101L65L
unsigned long0x41UL0101UL65UL
long long0x41LL0101LL65LL
unsigned long long0x41ULL0101ULL65ULL

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 至少能精确表示小数点后六位数字,取值范围至少为 1037103710^{-37}\sim 10^{37}

通常 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 中占位。