为什么int加uint返回uint?

问题描述 投票:11回答:3

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;
}
c++ int unsigned integer-arithmetic
3个回答
15
投票

如果用“应该”的意思是“我的编译器是否按照标准运行”:


1
投票

无符号整数类型通常表现为等价的mod 2 ^ N的抽象环绕代数环的成员;可能会看到一个N位无符号整数,而不是代表某个特定整数,而是将所有具有特定值的N个整数的集合表示在最低N位中。例如,如果一个人将两个最后4位为...1001...0101的二进制数字相加,则结果为...1110。如果将...1111...0001相加,结果将为...0000;如果从...0001中减去...0000,则结果为...1111。请注意,上溢或下溢的概念实际上没有任何意义,因为操作数的高位值未知,并且结果的高位值无关紧要。还要注意,将一个高位比特已知的有符号整数加到一个高位比特为“不知道/无关”的整数上,应产生一个高位比特为“不知道/无关”的数字(是无符号整数类型通常的行为)。


1
投票

[该行为很可能源于指针类型(存储位置,例如std::size_t)加上存储位置差(std::ptrdiff_t)也是存储位置之后的逻辑。

© www.soinside.com 2019 - 2024. All rights reserved.