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
: 查找补码)
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
: 查找补码)