C 将2字节字符数组转换为int

C 将2字节字符数组转换为int,c,C,我对如何让这段代码工作感到困惑: #include <stdio.h> int main() { unsigned char xx[]={1,3}; int xxx=*((int*)xx); printf("val is %d\r\n",xxx); } #包括 int main() { 无符号字符xx[]={1,3}; int xxx=*((int*)xx); printf(“val是%d\r\n”,xxx); } 代码将打印13或31?当我尝试它时,

我对如何让这段代码工作感到困惑:

#include <stdio.h>

int main()
{
    unsigned char xx[]={1,3};

    int xxx=*((int*)xx);
    printf("val is %d\r\n",xxx);
}
#包括
int main()
{
无符号字符xx[]={1,3};
int xxx=*((int*)xx);
printf(“val是%d\r\n”,xxx);
}

代码将打印13或31?当我尝试它时,它输出了一个很大的数字,这不是我所期望的。

我真的不确定你的目标是什么,但你可能想使用类似

int main()
{
    unsigned char xx[]= "13";
    printf("val is %s\r\n",xx);
}  


我不太确定你的目标是什么,但你可能想用类似的方法

int main()
{
    unsigned char xx[]= "13";
    printf("val is %s\r\n",xx);
}  


发生的情况是,您将
sizeof(int)
设置为4。int
xxx
填充了2个字节,但其他两个字节是随机的。这就是为什么你会得到一个大数字

如果你把它改成

 unsigned char xx[]={1,3,0,0};
然后,在一台小小的endian机器上,你会得到“769”的输出

这是因为在小尾端系统中,首先存储LSByte(0x01),然后存储下一个最高有效字节(0x02),然后存储其他字节(0x00,0x00)

编号
xxx
变为
0x0000031
769


在big-endian机器(powerpc或某些微控制器)上,MSbyte首先存储。因此,
xxx
变成了
0x01030000
16973824
发生的事情是,您的
sizeof(int)
为4。int
xxx
填充了2个字节,但其他两个字节是随机的。这就是为什么你会得到一个大数字

如果你把它改成

 unsigned char xx[]={1,3,0,0};
然后,在一台小小的endian机器上,你会得到“769”的输出

这是因为在小尾端系统中,首先存储LSByte(0x01),然后存储下一个最高有效字节(0x02),然后存储其他字节(0x00,0x00)

编号
xxx
变为
0x0000031
769



在big-endian机器(powerpc或某些微控制器)上,MSbyte首先存储。因此,
xxx
变为
0x01030000
16973824

如果在您的系统上,int不是16位,则读取超过数组的末尾。这是未定义的行为,因为您还读取存储在那里的任何垃圾。但是,即使您使用了16位整数类型,您仍将依赖于平台的端性。但是不管endianness是什么,输出都不会是31或13,除非您有4位字节。1为SOH(标题开头),3为ETX(正文结尾)。你的意思是“1”和“3”吗?你已经回答了帖子中唯一的问题。正如您所指出的,您的程序既没有打印13页,也没有打印31页。您到底想实现什么目标?即使在您的平台上,
int
是16位,它也不会打印13或31。@SouravGhosh AFAIK,是解引用打破了严格的别名。强制转换本身可能是由于另一个原因:
&xx
可能没有适当对齐。如果在系统上,int不是16位,则表示读取超过了数组的末尾。这是未定义的行为,因为您还读取存储在那里的任何垃圾。但是,即使您使用了16位整数类型,您仍将依赖于平台的端性。但是不管endianness是什么,输出都不会是31或13,除非您有4位字节。1为SOH(标题开头),3为ETX(正文结尾)。你的意思是“1”和“3”吗?你已经回答了帖子中唯一的问题。正如您所指出的,您的程序既没有打印13页,也没有打印31页。您到底想实现什么目标?即使在您的平台上,
int
是16位,它也不会打印13或31。@SouravGhosh AFAIK,是解引用打破了严格的别名。演员阵容本身可能是因为不同的原因:
&xx
可能没有正确对齐。如果您不理解这个问题,你为什么要发布答案?我不确定答案是否与我无法理解的答案不一样-如果猜测是错误的,我将删除该答案answer@Ingo这是代码最可能的两种预期行为方式。一种是简单地将数字1和3打印为字符数组的内容,另一种是解析为int,然后打印出结果。两者都符合预期结果。OP对
1
'1'
作为
char
初始值设定项的含义感到困惑,这并不意味着他的问题在我看来不清楚。@TinyT是的,也许在你看来不清楚。也许在我看来也不是。但是这个答案是从作者不理解这个问题开始的。如果他们不明白,就不应该回答。我没有说我不明白,但我不确定我对它的理解是否正确。也许你不理解答案的介绍如果你不理解问题,为什么要发布答案?我不确定这与我什么都不懂不一样-如果猜错了,我会删除答案answer@Ingo这是代码最可能的两种预期行为方式。一种是简单地将数字1和3打印为字符数组的内容,另一种是解析为int,然后打印出结果。两者都符合预期结果。OP对
1
'1'
作为
char
初始值设定项的含义感到困惑,这并不意味着他的问题在我看来不清楚。@TinyT是的,也许在你看来不清楚。也许在我看来也不是。但是这个答案是从作者不理解这个问题开始的。如果他们不明白,就不应该回答。我没有说我不明白,但我不确定我对它的理解是否正确。也许你不明白答案的介绍