我理解无符号整数和有符号整数只是根据二进制补码对底层位的不同表示。也就是说,以下是我的观察——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
强制编译来防止下溢,但产生的结果与上述相同......
更新:我发现错误在其他地方:中间赋值已转换float
为uint16_t
,这似乎是一个完全不同的问题,可能存在 UB。问题得到了回答。我更像是:
// gcc main.c -o main.out && ./main.out
#include <stdio.h>
#include <stdint.h>
void main() {
float a = -42;
uint16_t b = a;
printf("a = %.1f\n", a); // a = -42.0
printf("b = %d\n", b); // b = ???
}