C++ 无符号和有符号类型的相等操作数行为
可能重复:C++ 无符号和有符号类型的相等操作数行为,c++,c,C++,C,可能重复: 下面的代码将无符号int设置为负数,然后将无符号int与相同的负数进行比较。我得到的输出是“不相等的”。我知道,当将无符号int设置为-1时,在本例中,无符号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
下面的代码将无符号int设置为负数,然后将无符号int与相同的负数进行比较。我得到的输出是“不相等的”。我知道,当将无符号int设置为-1时,在本例中,无符号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";
}
}
#包括
#包括
int main(int argc,字符**argv)
{
uint8_t检验=0;
int8_t set=-1;
测试=设置;
如果(测试==设置){
std::cout这确实是标准行为。小于int
的类型在与=
和大多数其他运算符一起使用时会升级为int
。因此test
会升级为int
,值为255。set
会升级为int
,但它是一个负数,所以它的升级前后的值均为-1。由于255不等于-1,比较结果为false
寓意是:在比较中混合使用有符号和无符号类型时要小心。-Wall-Werror会告诉你确切的原因。在类型比较中,有符号/无符号不匹配。@larsmans-很容易忽略赋值test=set
。小心使用标准库名称,如set
作为变量。@WhozCraig-I知道代码是错误的,我只是问行为背后的基本规则。谢谢你的回答,这似乎与比较无符号整数和有符号整数时的情况相矛盾。我的问题是为什么它不同?@umps-有一些无符号类型的值不能表示为相应的有符号整数类型,反之亦然,因此大于或等于int
的类型的规则会执行不同的升级设置。