首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >K&R第2章:C中u和l整数后缀的区别

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

Stack Overflow用户
提问于 2011-06-15 03:11:25
回答 4查看 392关注 0票数 4

我是一名学生,正在阅读Kerningham和Ritchie为C写的书。

书中的一行话说,-1l1u小,因为在这种情况下,unsigned int被提升为签名的long。而是-1l > 1ul,因为在本例中,-1l被提升为未签名的long

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-06-15 03:28:12

当你在学习C语言的时候,如果你有问题,只要给自己写一个简单的程序就行了:

代码语言:javascript
复制
#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),所以规则规定负值将在设置为UINT_MAX时提升为无符号,这是可能的最大无符号值。

票数 0
EN

Stack Overflow用户

发布于 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是有符号的或无符号的,它就是实现定义的。但严格地说,这与手头的问题无关。

票数 2
EN

Stack Overflow用户

发布于 2011-06-15 03:26:19

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

if(-1l > 1ul)

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6348734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档