对于您如何解决此问题,我有些困惑:
考虑十进制数1027。此值作为16位二进制补码存储在小字节序机器上的地址124和125中,该机器的可寻址单元大小为一个字节。这些地址中的每个地址都有什么值(十六进制):
124:
125:
我知道一个小的字节序机器将其地址从最低有效字节到最高有效字节排序。但是除此之外,我不确定您将如何应用该概念以及如何将字节排序到地址中。
答案 0 :(得分:0)
以下是一些简单的Python代码,可以将该整数转换为小尾数十六进制表示形式:
# 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。
答案 1 :(得分:0)
每个大于char的整数类型都考虑了小端和大端的概念。
当您编写C代码时,您不必担心字节序的大小。例如,如果您有int X=100, Y=200;
,则X+Y
将始终在C的每个实现上返回300。
但是,当您需要在机器之间传送数据时,需要考虑到您可能会从大型字节序机器上接收到来自小字节序的数据,反之亦然。在这种情况下,您需要从little到big endian转换(为此,套接字库具有专门的功能)。
另一方面,在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);
答案 2 :(得分:0)
“小端”和“大端”与机器如何将内存中的字节多路复用到CPU的寄存器中有关。
每获得一个字节,它都会增加地址计数器,但是会将这些字节从左到右或从右到左放置到寄存器中吗?
因此,可以将加载到机器寄存器(或整数)中的地址反向存储在内存中。即使使用具有广泛数据总线的现代CPU,该概念仍然存在,并且在某些CPU中,字节在CPU内部交换。