将 char 数组转换为整数
Posted
技术标签:
【中文标题】将 char 数组转换为整数【英文标题】:cast char array to integer 【发布时间】:2012-09-02 00:14:38 【问题描述】:#include <stdio.h>
int main()
unsigned char a[4] = 1, 2, 3, 4;
int b = *(int *)&a[0];
printf("%d\n", b);
return 0;
我只是不明白为什么b
的结果是0x4030201
。
有人可以帮我吗?
【问题讨论】:
b
不是0x4030201
,你是说int b = *(int *)&a[0];
吗?
是的,我打错了。谢谢。我改了
你写的是未定义的行为。要做到这一点,您应该说:int b; unsigned char * a = (unsigned char *)&b;
(并删除声明b
的行。)
@KerrekSB,这如何帮助将“char 数组转换为整数”?
@Zboson:您可以这样写回单个字节。我没有说清楚。 a[0] = 1;
等
【参考方案1】:
你在一个 little-endian 机器上,这意味着大小大于一个字节的整数首先存储最低有效字节。
请注意,由于 x86 的通用性,如今大多数架构都是 little-endian。
【讨论】:
所以如果我使用的是大端机器,结果将是 0x1020304? Little-Endian 机器首先存储最不重要的 字节,而不是位。这是笔误吗? @Learner 如果 trion 是对的,它应该是 0x01020304,我认为他是。【参考方案2】:当你告诉编译器像这样创建一个数组时:
unsigned char a[4] = 1, 2, 3, 4;
这些数字按以下顺序存放在内存中的某处:
MemoryAddress0: 0x01 -> a[0]
MemoryAddress1: 0x02 -> a[1]
MemoryAddress2: 0x03 -> a[2]
MemoryAddress3: 0x04 -> a[3]
&a[0]
是一个char
指针,值为MemoryAddress0
,指向一个1字节的值0x01
(int*)&a[0]
是一个强制转换的指针,其值与MemoryAddress0
相同,但这次是int*
类型,因此它指向四个连续的字节。
我们在日常生活中使用的大多数机器都是little endian,这意味着它们在内存中存储从最低有效字节到最高有效字节的多字节值。
当int*
指向一个四字节的内存时,它遇到的第一个字节是最低有效字节,第二个字节是第二低有效字节,依此类推。
MemoryAddress0: 0x01 -> 2^0 term
MemoryAddress1: 0x02 -> 2^8 term
MemoryAddress2: 0x03 -> 2^16 term
MemoryAddress3: 0x04 -> 2^24 term
因此,4 字节的整数值变为0x01*2^0 + 0x02*2^8 + 0x03*2^16 + 0x04*2^24
,等于0x04030201
。
【讨论】:
【参考方案3】:因为你的系统是小端的。多字节整数中的第一个字节被解释为小端系统中的最低有效字节。
【讨论】:
以上是关于将 char 数组转换为整数的主要内容,如果未能解决你的问题,请参考以下文章