我正在学习一些 gdb,它涵盖了检查数组。有以下代码,我看到它是4个字节,以及如何a[1] = 2在数组中int a[] = {1,2,3}
(gdb) x/4xb a + 1
0x7fff5fbff570: 0x02 0x00 0x00 0x00
但是如果 a 大于单个十六进制字节所能显示的值呢?那么第二部分的效果如何呢?对不起,如果这不清楚,我不知道如何准确地拖拽它。
我正在学习一些 gdb,它涵盖了检查数组。有以下代码,我看到它是4个字节,以及如何a[1] = 2在数组中int a[] = {1,2,3}
(gdb) x/4xb a + 1
0x7fff5fbff570: 0x02 0x00 0x00 0x00
但是如果 a 大于单个十六进制字节所能显示的值呢?那么第二部分的效果如何呢?对不起,如果这不清楚,我不知道如何准确地拖拽它。
我想你在这里有两个问题。第一部分是如何从十进制转换为十六进制并返回;第二部分是如何在内存中表示多字节值。Guntram Blohm 的回答详细涵盖了第一部分,我将尝试在这里对第二部分的回答进行模糊处理。
因此,考虑一个多字节十六进制数...ABCD,其中每个字母代表一个字节。所以例如在 0x03B87C43 中,A 代表 0x03,B 代表 0xB8,C 代表 7C,D 代表 0x43。最后,D 被称为低位字节。
现在,各种字节可以在内存中以不同的方式排列;目前使用的主要形式有两种:
小端形式:
低位字节放置在最低的内存地址,因此我们的示例编号将因此存储在内存中:
1000 1001 1002 1003 <----- memory addresses, notional
+-----+-----+-----+-----+
| D | C | B | A |
+-----+-----+-----+-----+
Intel 处理器使用这种存储多字节数字的形式。
大端形式:
低位字节放置在最高内存地址,因此我们的示例编号将因此存储在内存中:
1000 1001 1002 1003 <----- memory addresses, notional
+-----+-----+-----+-----+
| A | B | C | D |
+-----+-----+-----+-----+
非英特尔 SUN 工作站使用这种形式(IIRC 他们使用摩托罗拉处理器)。
其他形式。
几乎可以使用任何其他安排。例如,PDP-11 使用的系统以小端格式存储 32 位值,除了交换 16 位一半的每个字节。因此,我们的样本编号将存储在内存中:
1000 1001 1002 1003 <----- memory addresses, notional
+-----+-----+-----+-----+
| C | D | A | B |
+-----+-----+-----+-----+
希望这个对你有帮助。
另一条评论太长了......您想将十进制转换为十六进制,反之亦然?
非常简短的回答:使用 windows calc,切换到程序员模式。
长一点的答案:得到一个可以做十六进制的计算器,或者一个可以做它的计算器应用程序。我更喜欢 android 上的 realcalc。
长答案:
要将十进制转换为十六进制,请将您的数字除以 16 并将余数记为十六进制数字。用被分割的数字重复,在你已经写下的数字前面加上数字。继续直到达到零。如果您想要字节,则将其分组为 2。
例子:
1_000_000 / 16 = 62_500, remainder 0 => 0
62_500 / 16 = 3_906, remainder 4 => 40
3_906 / 16 = 244. remainder 2 => 240
244 / 16 = 15, remainder 4 => 4240
15 / 16 = 0, remainder 15 => F4240, or 0F 42 40 in big endian, or 40 42 0F little endian.
要将十六进制转换为十进制,请取最左边的数字。乘以16,加上下一位。重复(相乘、相加)直到没有数字为止。
F4240 => 15
4240 => 15*16+4 = 244
240 => 244*16+2 = 3_906
40 => 3_906*16+4 = 62_450
0 => 62_450*16+0 = 1_000_000
如果你想以字节而不是数字来做同样的事情,它是一样的,但乘数是 256。字节 0x0f、0x42、0x40 的值为 15、66 和 64。
F 42 40 => 15
42 40 => 15*256+66 = 3_906
40 => 3_906*256+64 = 1_000_000