所以我写了很大.bin
个bytes
个文件。它们将96-bit
个数字写在two's complement
个数字中(仍然没有ASCII,只有字节)。现在我必须编写一个汇编程序来对这些文件中的数字进行排序并将其保存到另一个文件中(不要问为什么,assembly
类)。我已经为包含32k
个数字的文件完成了这样的操作:
./main < inSort32Kx96b.bin > XD.bin
diff outSort32Kx96b.bin XD.bin
文件outSort32Kx96b.bin
由我的老师提供给我。所以现在diff
不输出任何内容,它们是相同的(我可以使用hexdump
或mcview
来检查)。但是我得到了另一个文件inSort1Kx96b.bin
。我也对它进行排序。但后来差异说:
Binary files outSort1Kx96b.bin and XD.bin differ
@Edit:
cmp
给出了这两个文件不同的字节数。现在我可以看出差异:
所以差异来自0x000017C0
。那我现在不知道。如果它们以two's complement
顺序写成little endian
个数字,那么哪一个更大,f.e
00 00 00 00 00 00 00 81 00 00 00 00
或
00 00 00 00 00 00 00 7F 00 00 00 00
答案 0 :(得分:1)
hexdump以big endian顺序显示单个字节。如果必须将一堆字节解释为数字,则只反转字节顺序。
little endian big endian (C notation)
AB CD EF = 0xEFCDAB
01 02 03 04 05 06 07 08 09 10 11 12 = 0x121110090807060504030201
让我们将您的示例翻译成大端序:
0x000000008100000000000000
0x000000007F00000000000000
你可以看到第一个数字更大。
“两个补数”并不是一个非常明确的表达。更好的是“有符号整数”。显示数字是正数还是负数的符号是数字的第一位。这个位可以在大端数字的开头和小端数字的结尾找到。
<强>正强>
00 00 00 00 00 00 00 81 00 00 00 00 = 0x000000008100000000000000
00 00 00 00 00 00 00 81 00 00 00 10 = 0x100000008100000000000000
00 00 00 00 00 00 00 81 00 00 00 7F = 0x7F0000008100000000000000
<强>是负面的:强>
00 00 00 00 00 00 00 81 00 00 00 80 = 0x800000008100000000000000
00 00 00 00 00 00 00 81 00 00 00 CD = 0xCD0000008100000000000000
00 00 00 00 00 00 00 81 00 00 00 F0 = 0xF00000008100000000000000