最近有人提出这个:
uint8_t a = 0b10000000;
int8_t b = *(int8_t*) &a;
Run Code Online (Sandbox Code Playgroud)
是未定义的行为,因为 的值a
超出了我在int8_t
. 有人可以解释为什么这是未定义的行为吗?
我的主要问题是内存在那里,并且作为 的内存有效int8_t
,唯一的区别是int8_t
将该字节解释为-128
,而uint8_t
将其解释为128
。我对此感到更加困惑,因为快速平方根反函数使用:
float y = /* Some val*/;
int32_t i = * ( int32_t * ) &y;
Run Code Online (Sandbox Code Playgroud)
这将给出一个i
本质上与 无关的值(除了 IEEE 标准)y
,所以我不明白为什么重新解释一段内存可能是未定义的行为。