【发布时间】:2018-04-06 07:58:12
【问题描述】:
我想知道在 C 中从浮点类型转换为无符号整数类型时会发生什么情况,而该值不能由所讨论的整数类型准确表示。举个例子
func (void)
{
float a = 1E10;
unsigned b = a;
}
我在我的系统上获得的b 的值(我的系统上的unsigned 能够表示从0 到232-1 的值)是1410065408。这对我来说似乎是明智的,因为它只是转换结果的最低位。
我相信标准未定义此类操作的行为。我错了吗?如果我做这样的事情,我在实践中可以期待什么?
另外,有符号类型会发生什么?如果b 是int 类型,我会得到-2147483648,这对我来说真的没有意义。
【问题讨论】:
-
准确地说,这不是强制转换。赋值导致隐式转换。
-
强制转换和隐式转换之间有什么区别会影响这种情况下的结果吗?
-
强制转换是一种强制转换操作,它会导致显式转换。相同的规则用于隐式和显式转换,但它们在标准中是不同的。
-
你可以得到
-2147483648,因为这是你的处理器的指令产生的,或者你可以在不同的处理器上得到别的东西,或者你会得到奇怪的结果,因为你的处理器使用的是 64-位有符号转换指令在源代码中实现什么是 32 位无符号转换。作为未定义的行为,编译器不必保持一致。见blog.frama-c.com/index.php?post/2013/10/09/…
标签: c casting floating-point overflow unsigned