混合符号整数数学取决于变量大小

mixed-sign integer math depends on variable size

本文关键字:变量 取决于 符号 整数 数数 混合      更新时间:2023-10-16

函数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 %sn", 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 

作为通常的算术转换的结果,g2体中的ab都被提升为int,这就是为什么该函数工作得很好。

对于g1,因为(u) int32_t的排名不低于int,所以不会发生升级,并且最后一个要点(11.5.5)适用。两个操作数都被转换为unsigned类型,在a的情况下,这会导致下溢,产生一个比9大得多的值。因此,g1返回1 (true)。