将整数转换为二进制表示形式

3

以下是需要翻译的内容:

事情是这样的,1024 = 0x400,我假设它的二进制表示(小端)是\\x00\\x4\\x00\\x00。我试图做这样的事情:

int main()
{
    const char *str = "\\x00\\x4\\x00\\x00";
    const int *p = (const int *)str;
    printf("%d\n", *p);
}

但为什么上述代码不能返回 1024 呢?

2
此外,p 绝对不是指向 int 的指针,因此这是纯粹的未定义行为。至少你应该检查大小! - Kerrek SB
“definitely undefined behaviour”? :) - Michael Krelin - hacker
@KerrekSB,但是通过 printf "\\x00\\x4\\x00\\x00" 给我输出了 1024 - Alcott
@MichaelKrelin-hacker,Linux Bash。 - Alcott
在 shell 中,我期望该命令实际上输出二进制的 1024(这些字节),而不是你通常从 printf 得到的 1024 表示。 - Michael Krelin - hacker
3个回答

8

因为你转义了 \。请将它们还原:

const char *str = "\x00\x4\x00\x00";

жІЎй”ҷпјҢжҲ‘иў«Linux Bashдёӯзҡ„printf "\\x00\\x4\\x00\\x00"жҗһзіҠж¶ӮдәҶгҖӮ - Alcott
1
bash 首先取消转义字符串,然后进行处理。虽然我不确定这个 printf 是否会产生 1024 - Michael Krelin - hacker
但是在shell中,printf '\x00\x4\x00\x00'也会给我返回1024,所以我猜我不应该使用“\”。 - Alcott
Shell转义是完全不同的问题 ;) - Michael Krelin - hacker

4

您的字符串中有过多的反斜杠。

请尝试使用以下方式:

#include <stdio.h>
int main(void)
{
    const char *str = "\x00\x4\x00\x00";
    const int *p = (const int *)str;
    printf("%d\n", *p);
    return 0;
}

ideone的输出:

1024

1

你知道在任何printf语句的末尾输入换行符\n会发生什么吗?其中"\"部分被称为转义斜杠。这就是为什么\n不会被打印出来的原因。同样的,如果你输入"\\x00\\x4\\x00\\x00",它意味着\x00\x4\x00\x00将被存储,这显然没有任何意义。所以,你必须摆脱那些\(这些斜杠)。因此,

const char *str = "\x00\x4\x00\x00";

我很乐意为您完成工作。 :-)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接