0

玩弄 C 或 C99,我试图了解转换、位移和十六进制值是如何工作的。

我有以下问题

char c[4];
c[0] = 0x41;
c[1] = 0x42;
c[2] = 0x43;
c[3] = 0x00;
printf("%s", c); //prints ABC
printf("%X", c); //prints 99B11760

99B11760 来自哪里?

所以同样...

int main() {
    char a = 'a'; //ascii value is 0x41 (Mistake I made, 'a' is 0x61, 'A' is 0x41) 
    printf("%X\n",a); //outputs "61"? (THIS IS CORRECT OUTPUT, 'a' != 0x41)
}

我一直在寻找解决方案来解决如何解决将十六进制值存储到 char 中的类似问题,但我无法理解的是某些存储值与它的 ASCII 值不对应的原因或位置。由于它既不是 ASCII 十六进制值、十进制值或八进制值,所以使用 printf("%X\n", c); 时打印的是什么值;

4

6 回答 6

1

99B11760 来自哪里?

c这是在您强制它衰减为指针之后碰巧具有的值。

我一直在寻找解决这个问题的方法

什么问题?有没有你想做却不知道怎么做的事情?“我做了一些没有意义的事情并得到了一个无意义的答案”不是问题。只是不要那样做。

..但我遇到的问题是理解为什么或在哪里打印 61 而不是 ASCII 十六进制值 0x41。它不是十进制值,也不是八进制值。

如您所见,它应该没有特定的价值。但它必须是一些东西。如果你把骰子扔到空中,结果是 2,你想知道为什么它是 2 吗?当然不是。只有当它应该是一件事但又另一件事时,你才会遇到问题。在这种情况下,应该没有什么。

于 2012-04-09T10:12:33.310 回答
1

允许 C 中的数组变量自动转换为地址值(也称为指针值)。您看到的输出与数组的内容完全无关。

也许你打算这样做?

char c[4];
c[0] = 0x41;
c[1] = 0x42;
c[2] = 0x43;
c[3] = 0x00;
printf("%X", *(unsigned int*)c );
于 2012-04-09T10:10:40.053 回答
0
int main() {
char a = 'a'; //ascii value is 0x41
printf("%X\n",a); //outputs "61"?
}

在这种情况下,首先您将 'a'(ascii value = 97) 存储到字符 a 中,因此字符 a 包含 97,然后您将 97 以十六进制形式打印为“0x61”

char c[4];
c[0] = 0x41;
c[1] = 0x42;
c[2] = 0x43;
c[3] = 0x00;
printf("%s", c); //prints ABC
printf("%X", c); //prints 99B11760

在这种情况下

         '0x41' in decimal value is 65 is 'A' in ASCII
         '0x42' in decimal value is 66 is 'B' in ASCII
         '0x43' in decimal value is 67 is 'C' in ASCII   
         '0x00' in decimal value is 00 is null in ASCII   

如果格式说明符是 char/string 类型,它将输出 'ABC'

于 2012-04-09T10:23:16.227 回答
0
 printf("%X", c); //prints 99B11760

这会调用未定义的行为。x转换说明符需要 aunsigned int但您传递的是char *.

在问题的第二部分中,您应该a转换为unsigned int.

printf("%X\n", (unsigned int) a);

Aascii 值是0x41,但aascii 值是0x61

于 2012-04-09T10:08:19.683 回答
0

对于第一个问题,当您c使用%X格式打印时,它正在打印数组的地址(第一个字符的地址)。对于第二个问题,这是因为 ASCII 值a是 97(十进制),转换为十六进制是 61。如果使用A字符,那么它将打印 41,因为大写的 ASCII 值A是 65。

于 2012-04-09T10:08:47.437 回答
0

c是一个指针,所以当你使用任何东西打印它时,%s你会得到打印的指针地址。

于 2012-04-09T10:09:01.620 回答