使用C或C99,我试图了解如何使用cast,bitshifts和Hex值。
我遇到以下问题
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)
}
我一直在寻找如何解决将Hex值存储到char中的类似问题的解决方案,但我理解的是为什么或某些存储值与其ASCII值不对应的原因。由于它既不是ASCII十六进制值,十进制值或八进制值,使用printf时会打印什么值(“%X \ n”,c);
答案 0 :(得分:1)
允许C中的数组变量自动转换为地址值(a.k.a指针值)。您看到的输出与阵列的内容完全无关。
也许你打算这样做?
char c[4];
c[0] = 0x41;
c[1] = 0x42;
c[2] = 0x43;
c[3] = 0x00;
printf("%X", *(unsigned int*)c );
答案 1 :(得分:1)
99B11760来自哪里?
这是你强迫它腐烂成指针后的c
值。
我一直在寻找解决这个问题的方法
有什么问题?你有什么想做的,你不知道怎么办? “我做了一些毫无意义的事情并且得到了一个无意义的答案”并不是问题。只是不要这样做。
..但我遇到的问题是理解为什么或在哪里打印61而不是ASCII十六进制值0x41。它不是十进制值,也不是八进制值。
如你所见,它应该没有特别的价值。但它必须是某种东西。如果你在空中投掷死亡并且它下降了2,你想知道为什么它是2吗?当然不是。只有当应该是而 是另一回事时才会遇到问题。在这种情况下,它应该没有任何东西。
答案 2 :(得分:0)
printf("%X", c); //prints 99B11760
这会调用未定义的行为。 x
转换说明符需要unsigned int
,但您传递的是char *
。
在问题的第二部分,您应该a
投降到unsigned int
。
printf("%X\n", (unsigned int) a);
A
ascii值为0x41
,但a
ascii值为0x61
。
答案 3 :(得分:0)
对于第一个问题,当您使用c
格式打印%X
时,它会打印数组的地址(第一个字符的地址)。对于第二个问题,这是因为a
的ASCII值是97(十进制),转换为十六进制是61.如果你使用A
字符,那么它将打印41作为资本{{的ASCII值1}}是65。
答案 4 :(得分:0)
c
是一个指针,因此当您使用除%s
以外的任何内容打印它时,您将获得打印的指针地址。
答案 5 :(得分:0)
int main() {
char a = 'a'; //ascii value is 0x41
printf("%X\n",a); //outputs "61"?
}
在这种情况下,首先将'a'(ascii值= 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 type
,则输出'ABC'