我知道较低的数据类型会转换为较高的数据类型(例如,int、->、unsigned int、->、float、->等)。但我不确定以下几点:
int var = 5u - 10; // var = -5
auto var = 5u - 10; // var = 42949672915u是无符号的,但在第一种情况下,为什么-10 (有符号整数)没有转换为无符号值,而在第二种情况下却转换为无符号值?在第一种情况下,有符号的值没有转换为无符号的值,这对我来说很奇怪
发布于 2013-02-12 02:30:21
您的两个示例的右侧完全在无符号类型的域中工作。也就是说,你的两个表达式5u - 10的行为是相同的,这并不奇怪,因为它们是相同的。在这两种情况下,5u - 10表达式中都没有到int的转换(您似乎错误地假设了这一点)。
表达式5u - 10始终在无符号类型的域中求值,并产生等于UINT_MAX + 1 - 5的无符号结果。在第一次初始化中,您尝试将该值强制到int类型的变量中,这会导致实现定义的行为溢出。在您的例子中,您的实现的行为使得var获得了值-5。换句话说,在抽象C++语言领域,您最终使用var中的-5这一事实没有明确的解释。你观察到的结果只是你的编译器的一个怪癖。在其他一些编译器中,第一次初始化可能会在var中产生一个不同的值。
在第二种情况下,表达式的类型(也就是unsigned)变成了变量的类型,该变量是用无符号值初始化的,没有任何溢出。
发布于 2013-02-12 02:22:37
首先,由于您使用的是auto,因此编译器将在第二个示例中选择unsigned。
有符号数字和无符号数字在内部以相同的方式存储。这只是在打印时解释数字的方式,在比较中,因为“负”有符号数字小于0,其中无符号数字不能小于零-如果无符号数字是“负”,则检查它们,并将其打印为减号和否定的原始数字。无符号数字被视为打印时内部表示形式的任何形式。
因此,您看到的值只是同一数字的两种不同表示形式-有符号和无符号。
发布于 2013-02-12 02:31:54
在C和C++中,在绝大多数情况下,表达式的类型由表达式本身决定,而不考虑它出现的上下文。
int var = 5u - 10;5u的类型为unsigned int;10的类型为int。-运算符的规则会导致int参数转换为unsigned int,从而使表达式等同于5u - 10u。结果是UINT_MAX + 1 - 10,一个非常大的数字。初始化隐式地将其从unsigned int转换为signed int。由于该值(几乎可以肯定)不能表示为int,因此转换的结果是由实现定义的。在几乎所有现有的实现中,转换只是将无符号表示形式重新解释为带符号的值,从而导致-5。(这适用于对负值使用二进制补码表示的系统;由此产生的有符号/无符号转换的简单性是二进制补码如此广泛使用的原因之一。)
请注意,var的值不可能是4294967291;在您的系统上,int可以容纳的最大值(可能)是2147483647。
auto var = 5u - 10;5u - 10的求值方式与以前相同,在系统上得到的unsigned int结果为UINT_MAX + 1 - 5或4294967291。auto表示var采用表达式unsigned int的类型,因此不执行任何转换。(在具有16位int的系统上,结果将为65531。)
为了回答您的问题,在这两种情况下,常量10都从int转换为unsigned int。
https://stackoverflow.com/questions/14817857
复制相似问题