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