原始数值在0o和0x下的内存表示完全相同——前缀仅是书写约定,不影响二进制存储;如0o17、0x0f、15均对应十进制15,在32位int中都存为0x0000000f。

原始数值在 0o(八进制)和 0x(十六进制)下的内存表示完全相同——前缀只是人写代码时的记数法约定,不影响最终存入内存的二进制内容。
前缀不改变值,只改变书写方式
比如:
-
int a = 0o17;—— 八进制写法,17₈ = 1×8¹ + 7×8⁰ = 15₁₀ -
int b = 0x0F;—— 十六进制写法,0F₁₆ = 0×16¹ + 15×16⁰ = 15₁₀ - 两者都等于十进制 15,在内存中都存储为 0b00001111(假设 8 位整型)或标准 int 的补码形式,比如 32 位下是 0x0000000F
真正决定内存表示的是数值本身和类型
内存里存什么,取决于两个关键因素:
- 数值大小:15 和 255 在内存中当然不同;但 0o17、0x0F、15 都指向同一个整数 15
-
数据类型:是
char、int还是unsigned long long,决定了分配多少字节、是否符号扩展、是否用补码等
例如:char c = 0o377;(八进制 377 = 255₁₀)在有符号 char 下会溢出(若 char 是 8 位有符号,则 255 → −1),而 unsigned char uc = 0xFF; 同样是 255,却正常存为 0xFF。这里差异来自类型和取值范围,不是前缀导致的。
为什么容易误以为“表示不同”?
常见混淆点其实来自书写习惯和语言规则:
- C/C++ 中
017(无 o)是八进制,0x17是十六进制,17是十进制 —— 它们对应不同值(15、23、17),所以内存不同,但这和前缀无关,是数值本体不同 - Python 要求显式写
0o17,避免017引发歧义;C++14 起才支持0b和0o,老代码常用0开头表八进制,易出错 - 调试器或
printf("%x", n)显示0xF,只是格式化输出,并非内存里“存着 0x”
验证方法很简单
用指针逐字节观察同一变量的内存布局:
- 定义
int x = 0o17, y = 0x0F;,二者地址内容完全一致 - 用
unsigned char *p = (unsigned char*)&x;查看各字节,结果都是低位字节 0x0F,高位补零(小端机) - 反汇编或查看 objdump,它们生成的 mov 指令立即数也一样










