int加上unsigned int会返回一个unsigned int。应该这样吗?
考虑此代码:
#include <boost/static_assert.hpp>
#include <boost/typeof/typeof.hpp>
#include <boost/type_traits/is_same.hpp>
class test
{
static const int si = 0;
static const unsigned int ui = 0;
typedef BOOST_TYPEOF(si + ui) type;
BOOST_STATIC_ASSERT( ( boost::is_same<type, int>::value ) ); // fails
};
int main()
{
return 0;
}
如果用“应该”的意思是“我的编译器是否按照标准运行”:是
无符号整数类型通常表现为等价的mod 2 ^ N的抽象环绕代数环的成员;可能会看到一个N位无符号整数,而不是代表某个特定整数,而是将所有具有特定值的N个整数的集合表示在最低N位中。例如,如果一个人将两个最后4位为...1001
和...0101
的二进制数字相加,则结果为...1110
。如果将...1111
和...0001
相加,结果将为...0000
;如果从...0001
中减去...0000
,则结果为...1111
。请注意,上溢或下溢的概念实际上没有任何意义,因为操作数的高位值未知,并且结果的高位值无关紧要。还要注意,将一个高位比特已知的有符号整数加到一个高位比特为“不知道/无关”的整数上,应产生一个高位比特为“不知道/无关”的数字(是无符号整数类型通常的行为)。
[该行为很可能源于指针类型(存储位置,例如std::size_t
)加上存储位置差(std::ptrdiff_t
)也是存储位置之后的逻辑。