K& R第2章难度

时间:2011-06-14 19:11:25

标签: c

我是一名学生,经过kerningham和ritchie的书来获取c。 书中的一行表示-1l小于1u,因为在这种情况下,unsigned int会提升为签名long。但是-1l > 1ul因为在这种情况下-1l被提升为无符号long

我无法正确理解促销活动。当-1l被提升为无符号长整数时,它的价值是多少?如果有人能提供帮助,那就太好了。 感谢。

4 个答案:

答案 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:

  

否则,整数促销是   在两个操作数上执行。那么   以下规则适用于   推广操作数:

     

如果两个操作数具有相同的类型,则不再进一步转换   需要的。

     

否则,如果两个操作数都有有符号整数类型或两者都有   无符号         整数类型,具有较小整数转换类型的操作数   等级是         转换为具有更高等级的操作数的类型。

     

否则,如果具有无符号整数类型的操作数具有等级   更大或         等于另一个操作数的类型的等级,然后是操作数   同         有符号整数类型转换为操作数的类型   无符号         整数类型。

     

否则,如果带有符号整数类型的操作数的类型可以   代表         具有无符号整数的操作数类型的所有值   那么类型         具有无符号整数类型的操作数将转换为该类型   的         带有符号整数类型的操作数。

     

否则,两个操作数都将转换为无符号整数类型         对应于带有符号整数类型的操作数的类型。

我会试着解释一下:

尝试转换为较大的类型。如果signedunsigned之间存在冲突,如果较大(包括两种类型具有相同排名的情况)类型为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

由于siui具有相同的排名(它们都是int s),因此规则说负值将在设置为{{时被提升为无符号1}}这是最大可能的无符号值。