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。intxxx
填充了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。intxxx
填充了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是的,也许在你看来不清楚。也许在我看来也不是。但是这个答案是从作者不理解这个问题开始的。如果他们不明白,就不应该回答。我没有说我不明白,但我不确定我对它的理解是否正确。也许你不明白答案的介绍