我是一名学生,经过kerningham和ritchie的书来获取c。
书中的一行表示-1l
小于1u
,因为在这种情况下,unsigned int
会提升为签名long
。但是-1l > 1ul
因为在这种情况下-1l
被提升为无符号long
。
我无法正确理解促销活动。当-1l
被提升为无符号长整数时,它的价值是多少?如果有人能提供帮助,那就太好了。
感谢。
答案 0 :(得分:1)
在-1l > 1ul
中,-1l
被提升为unsigned long
,根据定义和标准,-1强制转换为unsigned
类型将是该unsigned
类型的值。 {1}}输入。
我从this answer here的记忆中得到了我的灵感,这是一个非常相关的问题。
在查看C99草案后,我已经挥之不去,例如参见6.3.1.3(2),其中表示该类型可表示的最大值将从原始值中加上或减去,直到它适合新的类型。我必须警告你char
,尽管它是一个整数类型,但它被视为特殊的:如果char
是有符号或无符号的,它是实现定义的。但严格地说,这就是眼前的问题。
答案 1 :(得分:1)
隐式促销是C语言中最难的事情之一。如果您的C代码表达式类似于
if(-1l> 1ul)
然后不会发生“整数促销”。两种类型都具有相同的大小,但签名不同。然后将-1l转换为具有非常大值的无符号长整数。这是“通常的算术转换”中的规则之一。
答案 2 :(得分:1)
这实际上是转换。促销从排名小于整数的类型变为整数。
C中的整数转换规则有些复杂。它们符合ISOC99§6.3.1.8¶1:
否则,整数促销是 在两个操作数上执行。那么 以下规则适用于 推广操作数:
如果两个操作数具有相同的类型,则不再进一步转换 需要的。
否则,如果两个操作数都有有符号整数类型或两者都有 无符号 整数类型,具有较小整数转换类型的操作数 等级是 转换为具有更高等级的操作数的类型。
否则,如果具有无符号整数类型的操作数具有等级 更大或 等于另一个操作数的类型的等级,然后是操作数 同 有符号整数类型转换为操作数的类型 无符号 整数类型。
否则,如果带有符号整数类型的操作数的类型可以 代表 具有无符号整数的操作数类型的所有值 那么类型 具有无符号整数类型的操作数将转换为该类型 的 带有符号整数类型的操作数。
否则,两个操作数都将转换为无符号整数类型 对应于带有符号整数类型的操作数的类型。
我会试着解释一下:
尝试转换为较大的类型。如果signed
和unsigned
之间存在冲突,如果较大(包括两种类型具有相同排名的情况)类型为unsigned
,请使用unsigned
。否则,仅在signed
可以代表两种类型的所有值的情况下使用{{1}}。
答案 3 :(得分:0)
当你学习C时,如果你有问题,那就给自己写一个简单的程序:
#include <stdio.h>
main() {
int si = -1;
unsigned int ui = 1;
if ( si > ui ) printf("-1l > 1u\n");
else printf("-1l <= 1u\n");
}
您会看到输出显示-1l > 1u
。
由于si
和ui
具有相同的排名(它们都是int
s),因此规则说负值将在设置为{{时被提升为无符号1}}这是最大可能的无符号值。