如何区分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。这里差异来自类型和取值范围,不是前缀导致的。
本文共计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。这里差异来自类型和取值范围,不是前缀导致的。

