如何区分0o与0x前数值在内存中的不同二进制表示?

2026-05-07 02:030阅读0评论SEO基础
  • 内容介绍
  • 相关推荐

本文共计641个文字,预计阅读时间需要3分钟。

如何区分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
  • 数据类型:是 charint 还是 unsigned long long,决定了分配多少字节、是否符号扩展、是否用补码等

例如:char c = 0o377;(八进制 377 = 255₁₀)在有符号 char 下会溢出(若 char 是 8 位有符号,则 255 → −1),而 unsigned char uc = 0xFF; 同样是 255,却正常存为 0xFF。这里差异来自类型和取值范围,不是前缀导致的。

阅读全文

本文共计641个文字,预计阅读时间需要3分钟。

如何区分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
  • 数据类型:是 charint 还是 unsigned long long,决定了分配多少字节、是否符号扩展、是否用补码等

例如:char c = 0o377;(八进制 377 = 255₁₀)在有符号 char 下会溢出(若 char 是 8 位有符号,则 255 → −1),而 unsigned char uc = 0xFF; 同样是 255,却正常存为 0xFF。这里差异来自类型和取值范围,不是前缀导致的。

阅读全文