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。但它是如何运作的?
答案 0 :(得分:0)
这种方法的工作方式是x
指向保存a
数据的相同位置。当您写入x[0]
或从a
读取时,您正在访问<service android:name=".MessageService"></service>
中保存的值的第一个字节。
这不是在char数组和int之间进行转换,这是“通过char指针访问int”。
答案 1 :(得分:0)
首先,请注意其确切如何工作并不是由C或C ++标准决定的,并且你真的不应该依赖任何特定的行为,除非你真的知道你正在做什么和其影响。 (因为你不得不问,即使看完这个答案,你也不会属于那个类别!)
这两种最常见的方法是整数存储在256位,每字节存储一位(字节通常是8位,2^8 = 256
)。因此,当您通过char*
访问它时,每个地方代表一位数。
在 little endian 格式中,您可以按数量级访问数字;例如x[0]
有一个位置,x[1]
有256位,x[2]
有256 ^ 2位,依此类推。也就是说,您可以从右到左访问数字。
在 big endian 格式中,数字的顺序相反。
通常由计算机硬件决定使用哪种格式。
构成int
的基数为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
:查找二进制补码表示法