K&;R第2章:C中u和l整数后缀的区别

K&;R第2章:C中u和l整数后缀的区别,c,C,我是一名学生,正在阅读克宁汉姆和里奇为C写的书 书中有一行说-1l小于1u,因为在这种情况下无符号int被提升为有符号长。但是-1l>1ul,因为在这种情况下-1l被提升为unsignedlong 我真的不能很好地理解这次促销。当提升为unsigned long时,-1l的值是多少?如果有人能帮忙,那就太好了。 谢谢。在-1l>1ul中,-1l被提升为无符号长,根据定义和标准,无符号类型的-1强制转换将是该无符号类型可表示的最大值 我的灵感来源于对一个非常相关的问题的记忆 在看了我一直在讨论的C

我是一名学生,正在阅读克宁汉姆和里奇为C写的书

书中有一行说
-1l
小于
1u
,因为在这种情况下
无符号int
被提升为有符号
。但是
-1l>1ul
,因为在这种情况下
-1l
被提升为unsigned
long

我真的不能很好地理解这次促销。当提升为unsigned long时,
-1l
的值是多少?如果有人能帮忙,那就太好了。
谢谢。

-1l>1ul
中,
-1l
被提升为
无符号长
,根据定义和标准,
无符号
类型的-1强制转换将是该
无符号
类型可表示的最大值

我的灵感来源于对一个非常相关的问题的记忆


在看了我一直在讨论的C99草案之后,请参见示例6.3.1.3(2),其中指出,该类型可表示的最大值将从原始值中添加或减去,直到它适合新类型。我必须警告您,
char
虽然是一个整数类型,但被视为特殊类型:如果
char
是有符号或无符号的,则它是实现定义的。但严格来说,这与手头的问题无关。

隐式提升是C语言中最困难的事情之一。如果你有一个C代码表达式

如果(-1l>1ul)


那么就不会有“整数促销”发生。两种类型大小相同,但符号不同-1l随后将转换为具有非常大值的无符号长字符。这是“常用算术转换”中的规则之一

学习C语言时,如果有问题,只需编写一个简单的程序:

#include <stdio.h>
main() {
  int si = -1;
  unsigned int ui = 1;
  if ( si > ui ) printf("-1l > 1u\n");
  else           printf("-1l <= 1u\n");
}
#包括
main(){
int-si=-1;
无符号整数ui=1;
如果(si>ui)printf(“-1l>1u\n”);

else printf(“-1l这实际上是一个转换。升级从秩小于整数的类型转换为整数

C中整数转换的规则有些复杂。根据ISO C99§6.3.1.8¨1,它们是:

否则,整数促销为 对两个操作数执行。然后 以下规则适用于 提升的操作数:

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

否则,如果两个操作数都具有有符号整数类型或都具有 未签名 整数类型,具有较小整数转换类型的操作数 等级是 已转换为具有更高秩的操作数类型

否则,如果具有无符号整数类型的操作数具有秩 大于或 等于另一个操作数类型的秩,然后是该操作数 具有 有符号整数类型转换为具有 未签名 整数类型

否则,如果带符号整数类型的操作数的类型 代表 具有无符号整数的操作数类型的所有值 那就打字吧 具有无符号整数类型的操作数转换为 的 带符号整数类型的操作数

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

我将尝试解释它们:


尝试转换为较大的类型。当
有符号
无符号
之间存在冲突时,如果较大的类型(包括两种类型具有相同等级的情况)类型是
无符号的
,使用
无符号的
。否则,只有在它可以表示两种类型的所有值的情况下才使用
有符号的

你的意思不是:“但是-1l>1ul,因为在这种情况下-1l被提升为
无符号的
长的
。更正完毕。谢谢。嘿,不要上当了。”“以最高的票数和最高的票数回答必须是最好的,我接受这个答案。”“…自己决定,并赞扬在回答中花费最多时间和最清晰的人。-1:这是发现实现定义的行为并将其标记为标准的一个很好的方法。虽然你的回答是正确的,但我觉得反复试验“并不能解决问题”当有实现定义的行为时…@rubenvb-
gcc-std=c99 test.c
。所以当你的程序不工作时,你会写一条注释,说明只要你的编译器不出错它就可以工作?我认为这种基本问题可以通过测试安全地得到回答。当你测试任何东西时,你会惊讶于什么是未定义的ng你扔它。像
sizeof
这样的东西在不同的平台上会有很大的不同,仅举一个简单的例子。所有的差异都是完全合法的。而且未定义的行为!=“程序不工作”。它可能有用,也可能无效,可能会吃掉你的孩子,可能会给你一个高五分。不,结果会因整数类型的大小而异。@ninjalj:我同意,这就是为什么我说“相同等级”(引用我的参考资料)。说“相同大小”可能会更清楚。这些是标准使用的官方术语。您引用的是通常的算术转换。整数升级是在任何表达式中出现的较小类型(如char和short)的转换。整数升级在6.3.1.1中找到。虽然很挑剔,但也很公平这里还有其他的提升,比如被称为“默认参数提升”的奇怪之处。+1表示指向其他答案的链接,指出表示独立性。