我知道无符号和有符号整数只是根据二进制补码底层位的不同表示形式。也就是说,以下是我的观察——
b
是一个非零整数,好:
// gcc main.c -o main.out && ./main.out
#include <stdio.h>
#include <stdint.h>
void main() {
int16_t a = -42;
uint16_t b = a;
printf("a = %d\n", a); // a = -42
printf("b = %d\n", b); // b = 65494
}
现在,我有一位同事声称有证据表明,在我们的嵌入式软件项目中(到目前为止我无法获得编译器工具链详细信息),
b
可能仅限于b = 0
!
处理器似乎是S32G。
问题: GCC 编译器工具链中是否有任何设置,或者是否存在 CPU 架构,使得无符号到有符号的值分配成为限制操作?
我尝试使用
-ftrapv
进行编译以强制防止下溢,但这会产生与上面相同的结果...
ISO C 要求此程序打印
65494
;需要从整数类型转换为无符号整数类型才能模归约到目标类型的值范围。 (在这种情况下,添加 2^16 使其进入 0..65535 范围)。
在 2 的补码实践中,这仅意味着在必要时截断位模式,或者对窄源进行符号扩展或零扩展。
所以不,除非 GCC 有一个令人讨厌且易于检测的错误,该错误会影响许多将负数转换为无符号并返回的代码,例如对于比特黑客。