每当我看到C程序直接引用内存中的特定位置(例如内存屏障)时,它都是用十六进制数字完成的,当你得到一个segfualt时它也会在windows中显示内存被十六进制数字分段。
例如:*(0x12DF)
我想知道为什么使用十六进制数字表示内存地址?
这有什么特别的原因,还是只是一个惯例?
答案 0 :(得分:20)
内存通常根据较大的单位进行操作,例如页面或段 倾向于具有2的幂的大小。因此,如果地址以十六进制表示,那就是 更容易阅读它们作为页面+偏移或类似的结构。十进制很难,因为 那个讨厌的因子是5,而二进制地址太长而不易阅读。
答案 1 :(得分:8)
它是一种更短的方式来表示本来用二进制写的东西。将十六进制转换为二进制和返回也非常好且容易。二进制的每4位数对应于十六进制的一位数。
答案 2 :(得分:6)
约定和便利性:十六进制更清楚地显示了各种指针与解决分割的关系。 (例如,共享库通常加载在偶数十六进制边界上,数据段同样位于偶数边界。)DEC小型机惯例实际上更喜欢八进制,但IBM的十六进制偏好在实践中胜出。
(至于为什么这很重要:什么更容易记住,0xb73eb000
或3074338816?它是jinx
上当前shell中的一个共享对象的地址。)
答案 3 :(得分:1)
这是最短,通用的数字格式,因此数字不会占用太多位置,每个人都知道它们的含义。
答案 4 :(得分:-2)
计算机只能理解二进制语言,它是0和1的集合。这意味着开/关。如在人类可读性的情况下,可以表示某些地址或数据的二进制数必须被转换成人类可读格式。十六进制就是其中之一。但问题可能是我们为什么不将二进制转换为HEX为什么不是十进制,八进制等。答案是HEX是可以在HW和SW上以最少的开销轻松转换的那个。这就是为什么我们使用地址作为HEX。但在内部它们仅用作二进制文件。
希望有所帮助:)