字符到十六进制不显示字符串';s ASCII值

字符到十六进制不显示字符串';s ASCII值,c,hex,printf,C,Hex,Printf,通过使用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 (Mist

通过使用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)
}
我一直在寻找解决方案,以解决将十六进制值存储到字符中的类似问题,但我很难理解的是,某些存储的值与它的ASCII值不对应的原因或位置。由于它既不是ASCII十六进制值、十进制值,也不是八进制值,所以使用printf(“%X\n”,c)时打印的是什么值

这将调用未定义的行为
x
转换说明符需要一个
无符号int
,但您正在传递一个
char*

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

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

A
ascii值是
0x41
,但是
A
ascii值是
0x61

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

c
是指针,因此当您使用
%s
以外的任何内容打印它时,您将打印指针地址

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

也许你是有意的

char c[4];
c[0] = 0x41;
c[1] = 0x42;
c[2] = 0x43;
c[3] = 0x00;
printf("%X", *(unsigned int*)c );
99B11760从哪里来

它是在您强制将其衰减为指针后碰巧得到的值
c

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

什么问题?是否有你不知道如何去做的事情?“我做了一些毫无意义的事情,得到了一个毫无意义的回答”不是问题。别那么做

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

正如你所看到的,没有什么特别的价值。但它必须是某种东西。如果你把一个骰子扔到空中,它落下的时候是2,你想知道为什么是2吗?当然不是。只有当问题本应是一回事,却又是另一回事时,你才会有问题。在这种情况下,没有什么是应该的

int main() {
char a = 'a'; //ascii value is 0x41
printf("%X\n",a); //outputs "61"?
}
在本例中,首先将“a”(ascii值=97)存储到字符a中,因此字符a包含97,然后将以十六进制形式打印97作为“0x61”

在这种情况下

         '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”

这段代码只是有缺陷。你在对编译器撒谎,告诉它你在传递一个东西,而实际上却在传递另一个东西。停止做无意义的事情,神秘感就会消失。我完全同意@DavidSchwartz的说法,但我发布这个问题的原因是为了帮助我理解像这样的错误代码在哪里出了问题。我尽量不发布愚蠢的问题,大部分时间我都很幸运地找到了答案,但这一次确实让我追了好一阵子。我希望不会重复,因为这仍然是未定义的行为。这确实更有意义,我并没有注意到printf语句需要取消引用才能使用正确的类型printf(“%d c[0]int-value\n”,*c)//打印65''printf(“%X c[0]十六进制值\n”,*c)//打印0x45''printf(“%s c[0]str值\n”,c)//打印“ABC”,再次感谢。
printf(“%X”,c)//打印99B11760
,当我在cygwin上编译和执行这一行时,我得到22CCEC,但当我在在线编译器“codepad”上编译和执行时,我得到BF859328值,请检查此@
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