混合符号整数数学取决于变量大小
函数g1()
和g2()
具有相同的逻辑,但输入类型具有不同的大小。 为什么他们会为负数返回不同的结果?
/*BINFMTCXX: -Wall -Werror -Wextra -std=c++11 */ #include #include char g1( int32_t a, uint32_t b ) { return a+b<9; } // fails when a+b is negative char g2( int16_t a, uint16_t b ) { return a+b<9; } // works if no overflow int main() { for ( int a=-2, b=0; a<=2; a++ ) { fprintf(stderr,"a=%+d, b=%d, g1=%+d, g2=%+d %s\n", a, b, g1(a,b), g2(a,b), g1(a,b)==g2(a,b)?"":"!" ); } return 0; }
当我运行它时,它表明当a+b
为负时g1()
失败:
$ ./mixed_sign_math_per_size.cpp a=-2, b=0, g1=+0, g2=+1 ! a=-1, b=0, g1=+0, g2=+1 ! a=+0, b=0, g1=+1, g2=+1 a=+1, b=0, g1=+1, g2=+1 a=+2, b=0, g1=+1, g2=+1
结果在C和C ++中是相同的。
通常的算术转换结果是, g2
体中的a
和b
都被提升为int
,这就是为什么这个函数运行得很好的原因。
对于g1
,因为( u
) int32_t
的排名不小于int
的排名,所以不会发生升级,并且最后一个项目符号点(11.5.5)适用。 两个操作数都转换为无符号类型,在a
情况下 – 导致下溢,产生远大于9的值。因此g1
返回1
( true
)。