混合符号整数数学取决于变量大小
mixed-sign integer math depends on variable size
函数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
体中的a
和b
都被提升为int
,这就是为什么该函数工作得很好。
对于g1
,因为(u
) int32_t
的排名不低于int
,所以不会发生升级,并且最后一个要点(11.5.5)适用。两个操作数都被转换为unsigned类型,在a
的情况下,这会导致下溢,产生一个比9大得多的值。因此,g1
返回1
(true
)。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 用C++中的一个变量定义一个常量
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 你能重载对象变量名本身返回的内容吗
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 尝试通过多个向量访问变量时,向量下标超出范围
- 试图让变量检查数组中的某些内容
- CUDA 的性能取决于声明变量
- ExprTK 未知变量分辨率取决于表达式类型
- 返回取决于sizeof的变量类型..参数包
- 变量模板函数,其中返回类型取决于模板参数列表
- 变量大小取决于语言机器实现,这意味着什么
- 混合符号整数数学取决于变量大小
- 引用全局变量的模板函数(取决于类型)