示例代码是这样的。
{
uint32_t x;
double y;
y = -1; // any negative number;
x = (uint32_t)(y);
print_log("%u", x);// here, x will be outputed, and it's 0;
}
为什么x为0?
我在linux-gcc中运行相同的代码,结果不同。
答案 0 :(得分:1)
double
值-1.0
超出了uint32_t
的范围。
将有符号或无符号整数值转换为无符号整数类型具有明确定义的行为。结果被包装到目标类型的范围内(减少模MAX + 1,其中MAX是目标类型的最大值)。
将超出范围的浮点值转换为整数类型具有未定义的行为。结果因系统而异,这并不奇怪。原则上,它甚至可能导致程序崩溃。
根据-1.0
的输入确定您想要的结果后,您可以弄清楚如何在没有未定义的行为的情况下生成该结果。