c标准只规定short≤int≤long,未指定字节数;char恒为1字节;浮点比较需用误差范围;void*不可直接解引用;跨平台应优先使用stdint.h固定类型。

int、long、short 到底占几个字节?别猜,看编译器
标准 C 只规定了 short ≤ int ≤ long 的相对大小关系,没说具体字节数。你写 sizeof(int) 在 x86_64 Linux 上通常是 4,在某些嵌入式平台可能是 2,在 Windows MSVC 下 long 还是 4 而不是 8 —— 这就是为什么硬背“int 是 4 字节”会翻车。
- 用
sizeof实测,而不是查博客记结论 - 跨平台项目优先用
<stdint.h></stdint.h>里的int32_t、uint8_t等固定宽度类型 -
long在 LP64(Linux/macOS)和 LLP64(Windows)模型下行为不同,传参或序列化时尤其容易出错
char 有 signed 和 unsigned 两种,默认行为看编译器
char 的符号性未被 C 标准强制规定:GCC 默认是 signed char,但 ARM 编译器或某些嵌入式工具链可能默认 unsigned char。一旦你把 char 当作小整数做位运算或比较,比如 if (c > 127),结果就不可移植。
- 需要明确符号性时,直接写
signed char或unsigned char - 处理二进制数据(如网络包、文件头)必须用
unsigned char,避免负值扩展污染高位 -
char唯一确定的是:它占 1 字节,且sizeof(char) == 1是铁律
float 和 double 的精度陷阱:别拿 == 判相等
IEEE 754 单精度 float 有效位约 7 位十进制,双精度 double 约 15–16 位。浮点运算是近似计算,0.1 + 0.2 == 0.3 在 C 里几乎总是 0(假)。
- 比较浮点数用误差范围:比如
fabs(a - b) - 金融计算别用 float/double,改用整数 cents 或专用库(如 decNumber)
-
float在多数现代 CPU 上并不比double快,除非显式启用 SIMD 或内存受限场景
void * 是万能指针,但不能直接解引用或算术运算
void * 可以接收任意对象指针,但它本身没有类型信息,编译器不知道它指向多大一块内存。所以你不能写 *(p + 1) 或 *p,会报错 error: invalid use of void expression。
立即学习“C语言免费学习笔记(深入)”;
- 必须先强制转成具体类型指针再操作:
((int *)p)[1]或*(int *)p - 函数参数用
void *很常见(如qsort),但回调函数里必须由调用方保证类型安全 -
void *和函数指针(如int (*)())不兼容,不能互相转换,否则 UB
类型大小、符号性、浮点精度、指针语义——这些不是语法糖,是每次写 int i = 0; 时编译器已经在背后做的决定。漏掉任一环,调试时看到的就不是逻辑错误,而是内存错乱或平台差异。










