c++ reinterpret_cast char to int* / 相邻位重复设置为1100
c++ reinterpret_cast char to int* / adjacent bits are repeatedly set as 1100
为什么第二个例子把地址存入int指针,然后读取相邻的位,结果是1100而不是0000?
示例 1:
char c = 'a';
int val = *reinterpret_cast<int*>(&c);
val = 97 或 0110 0001
示例 2:
char c = 'a';
int* iptr = reinterpret_cast<int*>(&c);
int val = *iptr;
val = -858993567 或 1100 1100 | 1100 1100 | 1100 1100 | 0110 0001
两者都有未定义的行为,通常已经存在,因为通过 int
指针访问 char
是一种别名冲突。
即使允许这样做,int
的大小几乎肯定会大于 char
的大小,并且尝试读取变量的相邻字节显然会导致未定义的行为。
更进一步,char
变量的对齐可能无法保证对于 int
.
足够大
总而言之,期望程序有任何特定的输出是错误的。
此外,@user253751 指出数字模式 (1100) 是在 Visual Studio 调试版本中生成的。在发布版本中,未设置此模式。
问题是你要类型转换一个char*
到一个int*
然后取消引用int*
导致 未定义的行为。
Undefined behavior means anything1 can happen including but not limited to the program giving your expected output. But never rely(or make conclusions based) on the output of a program that has undefined behavior. The program may just crash.
所以您看到(也许看到)的输出是未定义行为的结果。正如我所说,不要依赖具有 UB 的程序的输出。程序可能会崩溃。
因此,使程序正确的第一步是删除 UB。 然后并且只有那时你可以开始对程序的输出进行推理。
1有关未定义行为的更准确的技术定义,请参阅 this 其中提到:没有对程序行为的限制.
为什么第二个例子把地址存入int指针,然后读取相邻的位,结果是1100而不是0000?
示例 1:
char c = 'a';
int val = *reinterpret_cast<int*>(&c);
val = 97 或 0110 0001
示例 2:
char c = 'a';
int* iptr = reinterpret_cast<int*>(&c);
int val = *iptr;
val = -858993567 或 1100 1100 | 1100 1100 | 1100 1100 | 0110 0001
两者都有未定义的行为,通常已经存在,因为通过 int
指针访问 char
是一种别名冲突。
即使允许这样做,int
的大小几乎肯定会大于 char
的大小,并且尝试读取变量的相邻字节显然会导致未定义的行为。
更进一步,char
变量的对齐可能无法保证对于 int
.
总而言之,期望程序有任何特定的输出是错误的。
此外,@user253751 指出数字模式 (1100) 是在 Visual Studio 调试版本中生成的。在发布版本中,未设置此模式。
问题是你要类型转换一个char*
到一个int*
然后取消引用int*
导致 未定义的行为。
Undefined behavior means anything1 can happen including but not limited to the program giving your expected output. But never rely(or make conclusions based) on the output of a program that has undefined behavior. The program may just crash.
所以您看到(也许看到)的输出是未定义行为的结果。正如我所说,不要依赖具有 UB 的程序的输出。程序可能会崩溃。
因此,使程序正确的第一步是删除 UB。 然后并且只有那时你可以开始对程序的输出进行推理。
1有关未定义行为的更准确的技术定义,请参阅 this 其中提到:没有对程序行为的限制.