我是一名学生,正在阅读Kerningham和Ritchie为C写的书。
书中的一行话说,-1l比1u小,因为在这种情况下,unsigned int被提升为签名的long。而是-1l > 1ul,因为在本例中,-1l被提升为未签名的long。
我真的不能很好地理解这次促销。当-1l被提升为unsigned long时,它的价值是什么?如果有人能帮上忙那就太好了。谢谢。
发布于 2011-06-15 03:28:12
当你在学习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),所以规则规定负值将在设置为UINT_MAX时提升为无符号,这是可能的最大无符号值。
发布于 2011-06-15 03:20:03
在-1 \f25 -1l > 1ul -1\f6中,-1\f25 -1l -1\f6被提升为-1\f25 unsigned long -1\f6,根据定义和标准,转换为-1\f25 unsigned -1\f6类型的值将是该-1\f25 unsigned -1\f6类型可表示的-1\f25 Largets值。
我从this answer here的记忆中得到灵感,提出了一个非常相关的问题。
在查看了我一直徘徊的C99草案之后,例如,参见6.3.1.3(2),其中表示该类型可表示的最大值将从原始值中添加或减去,直到它适合新类型。我必须警告您,尽管char是一个整数类型,但它被特殊对待:如果char是有符号的或无符号的,它就是实现定义的。但严格地说,这与手头的问题无关。
发布于 2011-06-15 03:26:19
隐式提升是C语言中最困难的事情之一。如果您有一个C代码表达式,如下所示
if(-1l > 1ul)
则不会发生“整数提升”。这两种类型的大小相同,但符号不同。-1l随后将被转换为具有非常大的值的无符号长整型。这是“通常的算术转换”中的规则之一。
https://stackoverflow.com/questions/6348734
复制相似问题