<分区>
函数 g1()
和 g2()
具有相同的逻辑,但输入类型具有不同的大小。为什么它们对负和返回不同的结果?
/*BINFMTCXX: -Wall -Werror -Wextra -std=c++11
*/
#include <stdio.h>
#include <stdint.h>
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++ 中结果相同。