十六进制值为字符串C

时间:2017-03-16 02:14:58

标签: c assembly hex endianness

我正在为我的大学做一篇文章,并且遇到了一些困惑。

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写为字符串文字,但是当我尝试它时,它没有打印任何内容。

1 个答案:

答案 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"