无签名和签名类型的平等操作数行为
Equality operand behavior for unsigned and signed types
可能的重复:
签名/未签名的比较
因此,我有以下代码,该代码将无符号的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";
}
}
但是,什么导致平等操作数返回false?这似乎与签署/未签名的类似问题的答案形成鲜明对比的是
许多期望算术操作数或 枚举类型导致转化和产量结果类型类型 方式。目的是产生一种常见类型,这也是 结果。该模式称为通常的算术转换, 定义如下:
如果任何一个操作数是长双重的,则应转换另一个操作数 长双人。
否则,如果两个操作数是双重的,则应转换另一个 加倍。
否则,如果两个操作数是漂浮的,则另一个应转换为 float。
否则,应在两者上进行积分促销(4.5) 操作数54)
然后,如果任一操作数未签名,则应转换另一个 长期未签名。
否则,如果一个操作数是一个长的int,而另一个则无符号int,则 那么,如果一个长int可以代表未签名int的所有值, 未签名的int应转换为长int;否则两者 操作数应转换为未签名的长时间
否则,如果任何一个操作数很长,则另一个应转换为 长。
否则,如果任一操作数未签名,则应转换另一个 未签名。
因此,根据这个答案,由于两个操作数都是未签名的,因此另一个应转换为未签名,并且平等应通过。但这显然没有通过,正如这个问题中已经回答的那样,它们都被授予INT升级。
确实是标准行为。与==
和大多数其他操作员一起使用时,小于int
的类型将升级为int
。因此,test
被升至int
,值255。set
被提升为int
,但它是一个负数,因此促销前后其值为-1。由于255不等于-1,因此比较给出false
。
道德是:如果您在比较中混合签名和未签名类型,请小心。
- 与'operator='不匹配(操作数类型'String'且"void")
- 不正确的操作数类型 MSVC
- C2679 二进制"<<":未找到采用右操作数类型的运算符
- 错误:'operator>'不匹配(操作数类型为 'Student' 和 'Student'
- 与"运算符>>"不匹配(操作数类型为"QDataStream"和"QJsonObject")
- 与'operator<<'不匹配(操作数类型'std::ostream {aka std::basic_ostream<char>}'
- c++运算符重载-我实际返回的操作数类型是什么
- 没有运算符"=="与这些操作数匹配。操作数类型为:int == type_name'
- 与"operator<<"不匹配(操作数类型'std::ostream'
- C++ 重载:[错误] 与'operator='不匹配(操作数类型为 'String' 和"字符串")
- 错误:与"运算符>>"不匹配(操作数类型为"std::istream
- 与"运算符[]"不匹配(操作数类型为"std::unique_ptr<std::vector<int> >"和"int")
- 错误:与'operator='不匹配(操作数类型为 'PlDrustvo' 和"PlDrustvo")|
- 错误:与'operator='不匹配(操作数类型为"std::map<int、double>::iterator
- 没有运算符匹配这些操作数;操作数类型为: std::istream >> const char [5]
- \main.cpp|103|error: 与"operator<<"不匹配(操作数类型为"std::ostream {aka std::basic_ostream<char&g
- 重载运算符'<<'的使用不明确(操作数类型'ostream'(也称为"basic_ostream<char>")和"Person")
- 错误:与"运算符[]"不匹配(操作数类型为"QVector<int>"和"QCharRef")
- 错误:如果(object1 == object2),“操作器==”无匹配(操作数类型为“ const class”和“
- 没有运算符"="匹配这些操作数操作数操作数类型为 std::basic_ostream<char、std::char_traits<char>> = int