C语言中十进制、十六进制整数常量是值还是值的表示方式?
核心结论
十进制、十六进制整数常量是值的不同表示方式,不是值本身。
C标准中,整数常量的书写格式只是程序员用来指定目标值的语法糖,编译阶段就会被解析为对应的抽象整数值:比如 123 和 0x7B 只是写法不同,指向的是完全相同的整数值,和最终运行时的实际存储无关。这也符合《Modern C》中提到的设计思路:
计算机上的值的表示可能因架构不同存在“文化差异”,也可能由程序员为值指定的类型决定。因此,如果想要编写可移植代码,我们应主要围绕值本身而非其表示进行推导。
不同架构下整数值的常见表示差异
同一整数值在不同硬件架构上的底层存储会有明显区别,常见差异包括:
- 端序(字节序)差异:多字节整数的字节存储顺序不同。比如16位整数值
0x1234,大端架构存储为字节序列0x12 0x34,小端架构存储为0x34 0x12,32/64位整数也遵循对应架构的端序规则。 - 整数宽度差异:基础整数类型的位宽随架构变化。比如常量
0xFFFF,在int为16位的老旧嵌入式架构中属于有符号整数的最大值,在int为32位的x86/ARM主流架构中只是普通的正整数,还会因为类型推导规则匹配到不同的整数类型。 - 有符号数编码差异:有符号整数的编码规则不同。目前主流架构统一使用补码编码,值
-1的32位表示为0xFFFFFFFF;极少数老旧架构使用原码/反码编码,同一个-1的32位表示会对应为0x80000001或0xFFFFFFFE。 - 内存对齐差异:部分架构要求整数必须按位宽对齐存储,比如32位整数必须存放在4字节对齐的内存地址,非对齐访问会直接触发硬件异常;其余架构允许非对齐访问,但访问性能会明显下降。
内容的提问来源于stack exchange,提问作者dexter
相关产品推荐
相关产品推荐

