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

标签 c++ c language-lawyer

<分区>

函数 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++ 中结果相同。

最佳答案

由于 usual arithmetic conversionsg2 的主体中的 ab 都被提升为 int,这就是该函数完美运行的原因出色地。

对于g1,因为(u)int32_t的秩不低于int,没有促销发生,最后一个要点 (11.5.5) 适用。两个操作数都被转换为无符号类型,在 a 的情况下 - 导致下溢,产生远大于 9 的值。因此 g1 返回 1 ()。

关于c++ - 混合符号整数数学取决于变量大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38861423/

相关文章:

c++ - 这两个说法在N4140中不是不兼容吗?

c# - 如何使用像素捕捉绘制 GlyphRun?

c - Gtk 文件管理器作为顶部窗口打开

c - 在 child 完成 exec 后与 child 共享文件描述符表

c++ - std::shuffle 的顺序可以依赖于 RNG 之外的任何东西吗?

c++ - 如何在 C++ 中获得整数类型的无符号等价物?

c++ - 为什么对象复制要构造和销毁两次?

c - 尝试找到一种方法来存储可变数量的项目的可变数量的数据(不使用链接列表)

c++ - 为什么sv后缀引入的字符串不会过期?

c++ - 为什么成员变量不能作为参数的默认值?