C 算术运算期间的数据类型提升:-1<;(非单整数)1==假 main(){ 如果(-1
打印的C 算术运算期间的数据类型提升:-1<;(非单整数)1==假 main(){ 如果(-1,c,unsigned,integer-promotion,C,Unsigned,Integer Promotion,打印的小于。因为,(无符号字符)1被转换为(有符号字符)1,然后:(有符号)-1
小于。因为,(无符号字符)1
被转换为(有符号字符)1
,然后:(有符号)-1<(有符号)1
,因此输出小于
但是如果我将上述代码更改为if(-1<(unsigned int)1)
然后输出不小于
很明显,当我将unsigned char更改为unsigned int时:
- (有符号)-1被转换为无符号整数[发生完全相反的情况]
- 由于-1被存储为2对1的补充;位模式的计算结果为255(可能)
- 因此,255<1将计算为false,否则将执行
- 即使用
inta=-1;
代替“-1”,结果也是一样的
问题:
在有符号和无符号算术期间…如何确定有符号是否将转换为无符号,反之亦然
为什么无符号字符和字符之间的算术转换不同:显然无符号转换为有符号和无符号int,而int:显然有符号转换为无符号
PS:我知道这不依赖于编译器。所以不要说它依赖于编译器。规则如下:
6.3.1.8常用算术转换
否则,对两个操作数执行整数提升
以下规则应用于提升的操作数:
如果两个操作数的类型相同,则无需进一步转换
否则,如果两个操作数都具有有符号整数类型或都具有无符号整数类型,则整数转换秩较小的操作数类型将转换为秩较大的操作数类型
否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数类型的秩,则具有有符号整数类型的操作数将转换为具有无符号整数类型的操作数的类型
否则,如果带符号整数类型的操作数类型可以表示带符号整数类型的操作数类型的所有值,则带符号整数类型的操作数将转换为带符号整数类型的操作数类型
否则,两个操作数都将转换为与有符号整数类型的操作数类型相对应的无符号整数类型
规则的作用如下:
-1<(无符号字符)1
首先将两个操作数转换为int(因为int可以表示无符号字符的所有值)。然后对这些有符号类型进行比较。然后使用规则1。比较成功
-1<(无符号整数)1
整数不能表示无符号整数的所有值,因此使用规则3,并将有符号整数转换为无符号整数(UINT_MAX-1)。比较现在失败。这是由于整数提升。。两个参数都可以表示为整数,因此它们被转换为整数
ISO C 6.3.1.1第2段:
如果int可以表示原始类型的所有值,则该值将转换为int;
否则,它将转换为无符号整数。这些称为整数
促销。48)所有其他类型的促销均不受整数促销的影响
“等级”?这意味着什么?@bakra:你可以把它看作是类型的“排序”。例如,长整数的秩高于字符。等级的官方定义见6.3.1.1。@bakra积分类型的“等级”在C标准的其他地方有定义,但其要点是哪种类型的可能值范围更大,加上一些例外情况。特别是,“有符号整数类型的秩应大于精度较低的任何有符号整数类型的秩。”以及“任何无符号整数类型的秩应等于相应有符号整数类型的秩(如果有)。……同样,“秩”是否意味着int或char(不考虑有符号或无符号)…重新措辞:rank是否意味着类型在不考虑其值(有符号或无符号)的情况下使用了多少存储空间…我在哪里可以找到6.3.1.1内容?@Mark Byers:差不多。在这种情况下,这是由于整数提升,请注意您在标准中忽略的部分:“否则,整数提升将在两个操作数上执行。然后,以下规则将应用于提升的操作数:“不是所有文字都是标准int吗?”?(无符号字符->整数提升vs int->无符号整数提升)
main() {
if ( -1 < (unsigned char) 1 )
printf("less than");
else
printf("NOT less than");
}