问题描述
|
我是一名学生,正在阅读kerningham和ritchie所著的c书。
书中的一行说“ 0”小于“ 1”,因为在这种情况下,“ 2”被提升为带符号的“ 3”。但是
-1l > 1ul
是因为在这种情况下-1l
被提升为无符号long
。
我无法真正理解促销活动。 -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\");
}
您会看到输出显示ѭ9。
因为si
和ui
都具有相同的等级(它们都是int
s),所以规则说负值将在设置为UINT_MAX
时提升为无符号,这是可能的最大无符号值。
, 隐式提升是C语言中最困难的事情之一。如果您有一个C代码表达式,看起来像
如果(-1l> 1ul)
那么就不会进行“整数促销”。两种类型的大小相同,但签名不同。然后,-1l将被转换为具有很大值的unsigned long。这是“常规算术转换”中的规则之一。
, 这实际上是一次转换。促销活动从排名低于整数的类型到整数。
C语言中整数转换的规则有些复杂。根据ISO C99§6.3.1.8¶1,它们是:
否则,整数促销是
在两个操作数上执行。然后
以下规则适用于
提升的操作数:
如果两个操作数具有相同的类型,则不会进行进一步的转换
需要。
否则,如果两个操作数都具有符号整数类型或都具有
未签名
整数类型,具有较小整数转换类型的操作数
排名是
转换为具有更高等级的操作数的类型。
否则,如果具有无符号整数类型的操作数具有等级
大于或
等于另一个操作数类型的等级,然后是操作数
与
有符号整数类型将转换为
未签名
整数类型。
否则,如果带符号整数类型的操作数的类型可以
代表
具有无符号整数的操作数类型的所有值
然后输入
无符号整数类型的操作数将转换为该类型
的
带符号整数类型的操作数。
否则,两个操作数都将转换为无符号整数类型
对应于带符号整数类型的操作数的类型。
我将尝试解释它们:
尝试转换为较大的类型。当signed
和unsigned
之间存在冲突时,如果较大的(包括两种类型具有相同等级的情况)类型为unsigned
,则选择unsigned
。否则,仅当signed
可以表示两种类型的所有值时,才使用。
, 在-1l > 1ul
中,ѭ0升为unsigned long
,根据定义和标准,-1强制转换为unsigned
类型将是该that15ѭ类型可表示的较大值。
我从这里对一个相当相关问题的答案的记忆中得到了启发。
在查看了C99草案之后,我到处徘徊了,例如参见6.3.1.3(2),其中说该类型可表示的最大值将与原始值相加或相减,直到适合新类型为止。我必须警告您,尽管char
是一个整数类型,但还是要特殊对待:: 24 implementation是带符号或无符号的,它是实现定义的。但是,严格来说,这只是眼前的问题。