确定小端机器地址的十六进制值

问题描述 投票:2回答:3

我对你如何解决这个问题感到有点困惑:

考虑十进制数1027.该值作为16位二进制补码数存储到小端机器上的地址124和125中,该机器具有一个字节的可寻址单元大小。每个地址中有哪些值(十六进制):

124:

125:

我知道一个小端程序机器将它从最低有效字节到最高有效字节的地址命令。但除此之外,我不确定你将如何应用这个概念以及如何将字节排序到地址中。

c endianness machine-code
3个回答
0
投票

这里有一些简单的Python代码将该整数转换为little-endian十六进制表示:

# convert the integer (1027) to hex using 2 bytes and little-endian byteorder
(1027).to_bytes(length=2, byteorder='little').hex()

这给了0304。因此,第一个字节(03)在地址124中,第二个字节(04)占用下一个地址--125。


0
投票

每个大于char的整数类型都考虑了little和big endian的概念。

当你编写C代码时,你不必担心小端和大端。例如,如果你有int X=100, Y=200;,那么X+Y将在每次执行C时始终返回300。

但是,当您需要在机器之间传送数据时,您需要考虑到您可能会在大端机器上接收来自小端的数据,反之亦然。在这种情况下,您需要从小端转换为大端(为此,套接字库具有专门的功能)。

另一方面,在C中,int类型的整数不保持在16位,而是保持在至少16位。

要查看机器是小端还是大端,您可以使用256初始化值X并提取前8位并查看它们是否为0。 *((unsigned char*)&X)&((1<<8)-1))!=0。根据此表达式的结果,您可以定义宏LITTLE_ENDIAN或BIG_ENDIAN

要读取整数的每个字节,您可以定义这样的结构

typedef struct {
#if LITTLE_ENDIAN
unsigned char low;
unsigned char high;
#elif BIG_ENDIAN
unsigned char high;
unsigned char low;
#endif
} order_integer;

然后你可以使用整数顺序

x=400; 
order_integer *o=(order_integer*)&x; 
printf("%u %u\n", o->low, o->high);

如果要读取地址124和125中的整数(假设您已检查并确定sizeof int = 2),则可以这样做:

order_integer *o = (order_integer*)124;
printf("%u %u\n", o->low, o->high);

0
投票

“小端”和“大端”涉及机器如何将字节从存储器多路复用到CPU的寄存器中。

它获得的每个字节,它会递增地址计数器,但它是否将这些字节从左到右或从右到左放入寄存器?

因此,加载到机器寄存器(或整数)的地址可以反向存储在内存中。即使现代CPU具有广泛的数据总线,这个概念仍然存在,并且在某些CPU中,字节在CPU内部交换。

© www.soinside.com 2019 - 2024. All rights reserved.