#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,则另一个操作数应转换为long double。
否则,如果任一操作数为double,则另一个操作数应转换为double。
否则,如果任一操作数为float,则另一个操作数应转换为float。
否则,应对两个操作数执行整数提升(4.5)。54)
然后,如果任一操作数为unsigned long,则另一个操作数应转换为unsigned long。
否则,如果一个操作数为long int,另一个操作数为unsigned int,则如果long int可以表示unsigned int的所有值,则unsigned int应转换为long int;否则,两个操作数都应转换为unsigned long int。
否则,如果任一操作数为long,则另一个操作数应转换为long。
否则,如果任一操作数为unsigned,则另一个操作数应转换为unsigned。
因此,根据这个答案,既然两个操作数都是unsigned,则另一个操作数应转换为unsigned,等式应该通过。但很明显它没有通过,并且如在这个问题中已经回答的那样,它们都被提升为signed ints。
test = set
。 <g> - Pete Beckerset
。 - Mark B