所以我有下面的代码,它将unsigned int设置为负数,然后将unsigned int与相同的负数进行比较。我得到的输出是“不等于”。据我所知,在将unsigned int设置为-1时,unsigned int的值在这种情况下设置为255。
#include <stdint.h>
#include <iostream>
int main(int argc, char **argv)
{
uint8_t test = 0;
int8_t set = -1;
test = set;
if (test == set) {
std::cout << "Equal";
} else {
std::cout << "Not Equal";
}
}
但是,是什么导致等操作数返回false?这似乎与类似问题Signed/unsigned comparisons的答案形成鲜明对比,后者表示
许多期望算术或算术操作数的二元运算符 枚举类型导致转换并产生类似的结果类型 办法。目的是产生一种普通类型,它也是一种类型 结果。这种模式称为通常的算术转换, 其定义如下:
如果任一操作数的类型为long double,则另一个操作数将被转换 加倍。
否则,如果任一操作数为double,则另一个操作数将被转换 加倍。
否则,如果任一操作数是浮点数,则另一个操作数应转换为 浮。
否则,应对两者进行整体促销(4.5) operands.54)
然后,如果任一操作数是无符号长的,则另一个操作数将被转换 无条件的。
否则,如果一个操作数是long int而另一个是unsigned int, 那么如果long int可以表示unsigned int的所有值, unsigned int应转换为long int;否则两者 操作数应转换为unsigned long int。
否则,如果任一操作数为long,则另一个操作数应转换为 长。
否则,如果任一操作数是无符号的,则另一个操作数应被转换 无签名。
因此,根据这个答案,由于两个操作数都是无符号的,另一个应转换为无符号,并且相等应该通过。但它显然没有通过,而且正如在这个问题中已经回答的那样,它们都被提升为签署的内容。
答案 0 :(得分:9)
确实是标准行为。与int
和大多数其他运算符一起使用时,小于int
的类型会提升为==
。因此test
被提升为int
,其值为255. set
被提升为int
,但它是一个负数,因此它的值在促销之前和之后,是-1。由于255不等于-1,因此比较结果为false
。
道德是:如果你在比较中混合有符号和无符号类型,请小心。