unsigned char myArray[10];
myArray[0] = 0;
myArray[1] = 0;
myArray[2] = 0;
myArray[3] = 22;
cout << *((int *) (myArray)) << endl;
我在课堂上看到了这段代码,但没有得到很好的解释。我已经确定输出等于(256 ^ 3)* 22,但我不知道为什么这是它打印出来的。任何人都可以向我解释这个吗?
答案 0 :(得分:3)
该代码不安全且不可移植。
它(显然)在myArray
的前4个元素中存储值0,0,0和22,每个元素都是unsigned char
(单个字节)。
表达式myArray
是一个数组的名称,在大多数情况下(包括这个),“衰减”到指向数组的unsigned char*
类型的第一个元素的指针。强制转换将unsigned char*
转换为int*
,*
运算符会将该指针转换为int
结果。
因此*((int *) (myArray))
将myArray
的前4个字节和重新解释作为int
对象。
至少有3个问题。
myArray
对象int
正确对齐。 可能是,但如果不是,则行为未定义;你可能会得到一个总线错误,或者一个错误的结果,或者其他一些东西。 (x86处理器在对齐方面不是很挑剔,但其他系统都是。)sizeof (int) == 4
。如果int
是8个字节,那么它会将myArray
的第一个 8 字节重新解释为int
- 其中4个字节是垃圾。int
的表示形式可能有所不同。主要问题是字节顺序。假设没有其他错误,结果可能是256 3 * 22,或22 - 或甚至其他。答案 1 :(得分:2)
最后一行重新解释myArray
的地址作为指向int
的指针,取消引用它并打印它。在32位系统上,int
长度为四个字节,因此通过myArray[0]
的{{1}}正在作为myArray[3]
进行处理。 int
的感知价值取决于endianness。