int 到 char 数组的转换是如何发生的?

How does int to char array conversion occurs?

void main()
{
     int a;
     char *x;
     x = (char*)&a;
     a = 500;
     x[0] = 2;
     x[1] = 2;
     x[2] = 0;
     cout<<"final op : "<<a;
}

我知道答案是 514。但它是如何工作的?

其工作方式是 x 指向 保存 a 数据的相同位置。当您写入或读取 x[0] 时,您正在访问 a 中保存的值的第一个字节。 这不是在 char 数组和 int 之间转换,这是 "accessing an int through a char pointer".

首先,请注意,C 或 C++ 标准并未规定其具体工作方式,您真的不应该依赖任何特定行为,除非您真的知道什么你正在做的事情及其后果。 (既然你不得不问,你不属于那个类别,即使在阅读了这个答案之后!)

最常见的两种方式是将整数存储在 base 256 中,每个字节存储一位数字(字节通常为 8 位,并且 2^8 = 256)。所以当你通过char*访问它时,每个地方代表一个数字。

little endian 格式中,您按数量级访问数字;例如x[0]有个位,x[1]有256位,x[2]有256^2位,依此类推。也就是说,您从右到左访问数字。

big endian格式中,数字的顺序相反。

使用哪种格式通常由计算机硬件决定。

组成一个 int 的 base-256 数字也可能有所不同。 4 位数字很常见,但 2 位和 8 位数字也会出现,甚至在一些奇特的环境中 int 根本不适合这张图。

在您的特定计算机和编程环境中,可能发生的情况是 int 至少为 4 位数字并以小端形式存储;所以分配 500 意味着数字是

0, 0, 1, 244

(因为 500 = 244 * 1 + 1 * 256;记住如何计算基数的变化!)然后作业将数字更改为

0, 0, 2, 2

表示2 * 1 + 2 * 256 = 514.

(另请注意,如果 char 在您的编程环境中已签名,您可能会将 500 最右边的数字读为 -12 而不是 244: 查找补码)