C++ 为什么int加uint返回uint?

C++ 为什么int加uint返回uint?,c++,int,unsigned,integer-arithmetic,C++,Int,Unsigned,Integer Arithmetic,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 unsi

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;
}
#包括
#包括
#包括
课堂测试
{
静态常数int si=0;
静态常量unsigned int ui=0;
typedef BOOST_TYPEOF(si+ui)类型;
BOOST_STATIC_ASSERT((BOOST::is_same::value));//失败
};
int main()
{
返回0;
}
如果“应该”是指“我的编译器是否按照标准运行”:

C++2003:第5条第9款:

许多需要算术或枚举类型操作数的二进制运算符会导致转换并产生 结果类型以类似的方式显示。目的是生成一个公共类型,它也是结果的类型。 此模式称为常用算术转换,其定义如下:

  • 废话
  • 否则,废话,
  • 否则,诸如此类
  • 否则,如果其中一个操作数无符号,则另一个操作数应转换为无符号

如果“应该是”你的意思是“如果不是,世界会变得更好吗”:我无法回答这个问题。

无符号整数类型主要表现为值的包装抽象代数环的成员,这些值等价于mod 2^N;人们可能会认为一个N位无符号整数并不是代表一个特定的整数,而是在底部N位具有特定值的所有整数的集合。例如,如果将最后4位为
…1001
…0101
的两个二进制数相加,结果将是
…1110
。如果添加
…1111
…0001
,结果将是
…0000
;如果从
…0000
中减去
…0001
,结果将是
…1111
。请注意,溢出或下溢的概念实际上并不意味着什么,因为操作数的高位值是未知的,结果的高位值并不重要。还请注意,将一个高位为“不知道/不在乎”的有符号整数与一个高位为“不知道/不在乎”的整数相加,应该得到一个高位为“不知道/不在乎”的数字(这是无符号整数类型的主要行为)


无符号整数类型在参与比较、用于数字除法(这意味着比较)或升级为其他类型时,唯一无法作为换行代数环成员的位置。如果将无符号整数类型转换为更大的类型的唯一方法是为此目的使用运算符或函数,则使用此类运算符或函数可以清楚地表明它正在对高位进行假设(例如,将“低位为
…00010110
”的某个数字转换为“其低位为
…00010110
且其高位均为零的数字)。不幸的是,C不能做到这一点。将有符号值添加到大小相等的无符号值会生成大小相同的无符号值(这对于上面的无符号值解释是有意义的),但将较大的有符号整数添加到无符号类型将导致编译器默认后者的所有高位为零。根据编译器的升级规则,某些编译器可能认为两个表达式大小相同,而其他编译器可能认为它们大小不同。这种行为可能是由于指针类型背后的逻辑(内存位置,例如
std::size\t
)造成的加上内存位置差异(
std::ptrdiff\u t
)也是内存位置

换句话说,
std::size\u t=std::size\u t+std::ptrdiff\u t

当此逻辑转换为基线类型时,这意味着,
unsigned long=unsigned long+long
,或
unsigned=unsigned+int

@supercat的“其他”解释也可能是正确的


很清楚的是,
无符号
整数不是被设计的,或者不应该被解释为数学上的正数,甚至在原则上也不是。请看

也许你应该问问设计这种语言的人。网站上还有另一篇关于同样主题的帖子,你可以在这里找到:希望这有帮助+1用于提供完整的测试用例。我确信C++标准委员会的目的是使世界变得更美好,因此,如果“应该是”,我实际上是指“为什么世界不会是一个更好的地方,如果不是这样”。那么,VAHAGN——那么,代码>(int)0x7000万+(未签署的int)0x7000万< /代码>将导致一个积极的价值。无符号整数类型通常用于有效地计算较低的位,而忽略较大值的较高位(例如,使用
uint8\t
值来计算一组字节的总和)。我的描述与正常描述不符,但它与这种用法一致,代表了大多数程序员依赖无符号整数包装行为的意图;它还与编译器生成的代码一致,例如,
uint16_t x,y,z。。。x=y*z,以忽略结果中除较低16位以外的所有位。