我正在为我的大学做一篇文章,并且遇到了一些困惑。
int main(void) {
unsigned int i = 0x00646c72;
printf("H%x Wo%s\n", 57616, (char *) &i);
}
基本上在一个小端的结构中打印出来:He110 World
如果这段代码是由Big Endian arquitecture执行的,我必须告诉它会打印什么。
到目前为止我所知道的:
' H',空间,' W'和' o'因为是8位表示的字符串文字,所以它将保持原样。
基数16的值57616是e110。据我所知,这应该以小端存储为10e1,但它仍然打印为' e110',也许它与%x格式化程序的工作方式有关?
0x00646c72将ASCII转换为' dlr'因此,在小端,它读取' rld'但是在Big Endian中,它会打印出来#ddr'。这个假设是否正确?
最后是一个非常相关的问题:
#define VGABUF ((void *) 0xb8000)
void begin(void) {
int *vga = VGABUF;
*vga = 0x2f4b2f4f;
while (1)
continue;
}
我要求修改此代码(显示带绿色背景的OK标记),以便在Big Endian arquitecture中表现完全相同。 我认为我应该将vga写为字符串文字,但是当我尝试它时,它没有打印任何内容。
答案 0 :(得分:1)
基数16的值57616是e110。据我所知,这应该是 以小尾数形式存储为10e1,但它仍然以' e110'形式打印, 也许它与%x格式化程序的工作方式有关?
正确,它的打印方式与endianess无关,这在大端机器上不会改变。
0x00646c72将ASCII转换为' dlr'所以在小端读它 ' RLD'但是在Big Endian中,它会打印出来#ddr'。这是假设吗? 正确的吗?
你在开始时忘记了0x00。铸造到(char *)这是" rld" +终止0。 如果你有大端,你会得到0,0x64,0x6c,0x72,终止0将是第一个字符,打印的字符串将为空
所以结果将是" he110 wo \ n"