2016-08-12 55 views
1

目前,我正在学习计算机原理,程序集和我被困在大端--小端。计算机原理,大小尾数

我已经检查了EIP寄存器(在Linux中使用命令x/8xw),它保存的值为0x00fc45c7(一个字,4字节)。当我请求字节而不是字(x/8xb)时,我得到一个反向序列(因为它是小端机):c7 45 fc 00.当我请求半字(x/8xh)时,我得到这个序列:45c7和00fc。这些都是平等的对方,我想自己检查一下。当将第一个十六进制值(0x00fc45c7)转换为十进制值时,我得到16532935(算法如下:16^7 * 0 + 16^6 * 0 + 16^5 * 15 + 16^4 * 12 + 16^3 * 4 + 16^2 * 5 + 16^1 * 12 + 16^0 * 7)。这是一个简单的从十六进制到十进制的转换,我理解它。

在我正在阅读的书中,有一个计算示例,它证明0x00fc45c7与c7 45 fc 00相同。计算如下: 0 *(256^3)+ 252 *(256^2)+ 69 *(256^1)+ 199 *(256^0)。

据我所知,0,252,69和199是我们在将每个字节转换成十进制后得到的值fc = 15 * 16^1 + 12 * 16^0 = 252,45 = 69和c7 = 199 。我不明白的是256代表什么,为什么我们提高256的权力?这些计算的算法是什么?如果我们不使用字节(c7 45 fc 00),而使用半字(45c7和00fc)以获得与0x00fc45c7中相同的值,那么它们会是什么?我通过互联网冲浪,但还没有找到任何答案。所有文章都只是解释了小端和大端系统之间的差异,但是解释并没有涉及到这个问题。非常感谢你的帮助。

回答

3

您可以使用256,因为您可以将基本256中的两位十六进制数字看作单个数字。因此,您可以假设您在处理每个字节时处于基本256位。

+1

如果使用一个十六进制字符(1个半字节)作为数字,则基数为16.如果使用两个十六进制字符(一个字节)作为单个数字,则基数为16^2 = 256。如果使用四个十六进制字符(半字)作为单个数字,则基数为16^4 = 65536。 –

+0

谢谢你的帮助! – ShHolmes