gpt4 book ai didi

C编程: words from byte array

转载 作者:太空宇宙 更新时间:2023-11-04 01:10:49 24 4
gpt4 key购买 nike

关于从字节数组中读取单词,我有些困惑。背景是我正在使用 C 语言编写的 MIPS 模拟器,用于介绍计算机体系结构类(class),但是在调试我的代码时,我遇到了一个令人惊讶的结果,从 C 编程的角度来看,我根本无法理解。

我有一个名为 mem 的字节数组,定义如下:

uint8_t *mem;
//...
mem = calloc(MEM_SIZE, sizeof(uint8_t)); // MEM_SIZE is pre defined as 1024x1024

在我的一些测试中,我手动将一个 uint32_t 值存储到一个名为 mipsaddr 的地址的四个内存块中,一次一个字节,如下所示:

for(int i = 3; i >=0; i--) {
*(mem+mipsaddr+i) = value;
value = value >> 8;
// in my test, value = 0x1084
}

最后,我测试了尝试以两种方式之一从数组中读取单词。在第一种方式中,我基本上是尝试一次将整个单词读入一个变量:

uint32_t foo = *(uint32_t*)(mem+mipsaddr);
printf("foo = 0x%08x\n", foo);

在第二种方式中,我手动从每个单元格中读取每个字节,然后将它们与移位相加:

    uint8_t test0 = mem[mipsaddr];
uint8_t test1 = mem[mipsaddr+1];
uint8_t test2 = mem[mipsaddr+2];
uint8_t test3 = mem[mipsaddr+3];

uint32_t test4 = (mem[mipsaddr]<<24) + (mem[mipsaddr+1]<<16) +
(mem[mipsaddr+2]<<8) + mem[mipsaddr+3];
printf("test4= 0x%08x\n", test4);

上面代码的输出是这样的:foo=0x84100000test4= 0x00001084

test4 的值与我预期的完全一样,但是 foo 似乎颠倒了字节的顺序。为什么会这样?对于 foo,我希望 uint32_t* 指针指向 mem[mipsaddr],并且由于它是 32 位长,它只会按照它们在数组中存在的顺序读取所有 32 位(即 00001084) .显然,我的理解是不正确的。

我是新来的,我确实搜索了这个问题的答案,但找不到。如果已经发布了,我深表歉意!但如果没有,我希望有人能在这里开导我。

最佳答案

它(除其他外)在这里解释:http://en.wikipedia.org/wiki/Endianness

当将大于一个字节的数据存储到内存中时,它取决于字节存储顺序的体系结构(即 CPU)。或者,首先存储最高有效字节,最后存储最低有效字节,反之亦然。当您通过字节访问操作读回各个字节,然后将它们合并以再次形成原始值时,您需要考虑特定系统的字节顺序。

在您的 for 循环中,您正在逐字节存储您的值,从最高有效字节开始(倒数索引有点误导 ;-)。之后你的内存看起来像这样:0x00 0x00 0x10 0x84。

然后您将使用单个 32 位(四字节)访问读回该字。根据我们的架构,这将变为 0x00001084(大端)或 0x84100000(小端)。既然你得到了后者,你就在一个小端系统上工作。

在第二种方法中,您使用的顺序与存储各个字节的顺序相同(首先是最重要的字节),因此您会得到与之前存储的值相同的值。

关于C编程: words from byte array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12740336/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com