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 其中提到:没有对程序行为的限制.