如何区分0o与0x前数值在内存中的不同二进制表示?
- 内容介绍
- 相关推荐
本文共计641个文字,预计阅读时间需要3分钟。
原始内容:
前缀不改变值,只改变书写方式
比如:
-
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 指令立即数也一样
本文共计641个文字,预计阅读时间需要3分钟。
原始内容:
前缀不改变值,只改变书写方式
比如:
-
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 指令立即数也一样

