有人可以解释以下程序的输出:
int main()
{
int i=512;
char *c=(char*)&i;
c[0]=1;
cout<<"i is:"<<i<<endl;
return 0;
}
输出为:513
您的程序的输出未指定。在实践中,这取决于平台的字节顺序和int
类型的宽度。
您的平台是little-endian。为简单起见,我们假设它int
是 32 位宽。
512
10是0x00000200
十六进制的。这存储在内存中
00 02 00 00
您的代码将第一个字节修改为01
. 这会将 更改int
为0x00000201
,即513
十进制。
该程序表现出未指定的行为,具体取决于机器的体系结构。要对输出进行预测和推理,需要了解编译器和目标架构。
解释:
int main()
{
/* Creates int equal to 512 */
int i=512;
/* Creates a char pointer, and points this at i */
char *c=(char*)&i;
/* Overwrites the lowest byte of the 4 byte int with 1 */
/* This sets the lowest bit of the int, which adds 1 */
c[0]=1;
/* Displays the updated int */
cout<<"i is:"<<i<<endl;
return 0;
}
究竟哪一部分 int 被覆盖取决于您正在编译的平台的字节序。鉴于 513 的最终结果,您的系统显然是 little-endian。