C语言数据类型都有什么?_常见数据类型关键字与取值范围总结

1次阅读

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

C语言数据类型都有什么?_常见数据类型关键字与取值范围总结

int、long、short 到底占几个字节?别猜,看编译器

标准 C 只规定了 shortintlong 的相对大小关系,没说具体字节数。你写 sizeof(int) 在 x86_64 linux 上通常是 4,在某些嵌入式平台可能是 2,在 windows MSVC 下 long 还是 4 而不是 8 —— 这就是为什么硬背“int 是 4 字节”会翻车。

  • sizeof 实测,而不是查博客记结论
  • 跨平台项目优先用 <stdint.h></stdint.h> 里的 int32_tuint8_t 等固定宽度类型
  • long 在 LP64(Linux/macos)和 LLP64(Windows)模型下行为不同,传参或序列化时尤其容易出错

char 有 signed 和 unsigned 两种,默认行为看编译器

char 的符号性未被 C 标准强制规定:GCC 默认是 signed char,但 ARM 编译器或某些嵌入式工具链可能默认 unsigned char。一旦你把 char 当作小整数做位运算或比较,比如 if (c > 127),结果就不可移植。

  • 需要明确符号性时,直接写 signed charunsigned char
  • 处理二进制数据(如网络包、文件头)必须用 unsigned char,避免负值扩展污染高位
  • char 唯一确定的是:它占 1 字节,且 sizeof(char) == 1 是铁律

Floatdouble 的精度陷阱:别拿 == 判相等

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; 时编译器已经在背后做的决定。漏掉任一环,调试时看到的就不是逻辑错误,而是内存错乱或平台差异。

text=ZqhQzanResources