C ++使用什么规则来确定涉及两种不同整数类型的算术表达式的类型?
一般来说,很容易找出结果,但是我遇到了一些令人困惑的签名/无符号整数的情况。
例如,以下两个内容在VS中都显示为unsigned int
。
unsigned int us = 0;
int s = 1;
auto result0 = us - s; // unsigned int
auto result1 = s - us; // unsigned int
其他编译器是否相同?是否有确定类型的具体规则?
答案 0 :(得分:5)
这一切都很明确。
1
是签名的字面值。实际上,如果你想要它unsigned
,你需要使用十六进制或八进制表示法,适当的后缀(例如u
)或演员表。
如果遇到以signed int
和unsigned int
为参数的算术运算,则signed int
已转换为unsigned int
类型。
答案 1 :(得分:0)
这是一个简短的,有道理的答案,我希望它有用,即使它没有涵盖所有内容,甚至可能过于简单化了:
除非指定为“U”,否则会对文字进行签名。
在涉及不同类型的整数表达式中,提升较小的整数类型(如果所有涉及的类型都适合int,则为int,否则提升为unsigned int),因此当无符号和有符号值时,例如如果无符号变量的位宽与int相同,则将有符号值“提升”为unsigned int。因此,编译器认为unsigned int比促销规则中的signed int“更大”,即使在运行时期间存储在变量中的实际值很容易适合相同位数的带符号表示。
另请注意,'char'可能表示unsigned char,而'int'始终表示signed int。