为什么 (-i) 的类型(其中 i 是无符号的 int)仍然是无符号的 int?
Why is the type of (-i), where i is unsigned int, still unsigned int?
int main() {
unsigned int i = 1;
typeof(-i) j = -i;
}
当我查看 gdb 中的j
类型时,它显示它是unsigned int
型。为什么类型没有移动到相应的签名类型?选择这种行为背后有什么原因吗?我发现该类型是否会转换为相应的有符号类型更直观。
一元否定运算符-
除了应用整数提升外,不会更改其参数的类型。 C 标准第 6.5.3.3p3 节规定:
一元
-
运算符的结果是其(提升的(的负数 操作数。整数提升对操作数执行,并且 结果具有升级类型
整数升级的详细信息在第 6.3.1.1p2 节中详细介绍:
以下内容可用于表达式中,无论
int
或unsigned int
可用于:
- 整数类型(
int
或unsigned int
除外(的对象或表达式,其整数转换排名小于或等于int
和unsigned int
的军衔.- 类型为
_Bool
、int
、signed int
或unsigned int
的位域。如果
int
可以表示原始类型的所有值(如 受宽度限制,对于位字段(,该值将转换为 一个int
;否则,它将被转换为unsigned int
.这些是 称为整数促销。所有其他类型均由 整数促销。
i
的类型是unsigned int
根据上述段落不受整数促销的影响(实际上,它是整数促销的目标类型(。 因此,不执行任何升级,并且-i
的类型与i
的类型相同。
对无符号类型的否定不会产生有符号的负值,因为无符号否定是有意义和有用的。
首先,对于给定的无符号值a
有一个无符号值b
使得a + b == 0
。将b
标识为-a
是有意义的,反之亦然:在类型的模算术下的一种加法逆运算。
无符号算术可以模拟二的补码;在这种情况下,否定充当二的补码运算符:它"翻转所有位并加一"。例如,-0x1U
是0xFF...FFU
。
相关文章:
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 从 std::vector<无符号字符>切片中提取 int?
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- C++无符号短裤的划分导致 int
- 将无符号转换为复杂<int>原因符号转换警告
- 如何解决隐式转换丢失整数精度:'size_t'(又名"无符号长")到'int'警告?
- 无符号的 int 到有效数字
- C++:使用没有位移位的指针将无符号字符转换为无符号 int
- 整数类型应该显式转换(例如"int"到"无符号")还是只会增加混乱?
- 有没有办法在C++中将mpz_t转换为 int 或无符号长 int?
- 是否可以将无符号 int 的最大值转换为 int 并将结果转换为 -1?
- 为什么QByteArray的大小是"int"而不是"无符号int"
- 为什么 (-i) 的类型(其中 i 是无符号的 int)仍然是无符号的 int?
- 无符号长整型和无符号 int 之间有什么区别,这 2 种类型应该如何在 c# 中封送?
- 如何对无符号长 int 进行位掩码?
- 使用无符号int作为二进制来在c++中实现一个集
- 这个右移是如何工作的:字符串流>>无符号的int>>无符号的int?
- 转换 int -> 无符号长 长 是否由标准定义
- 为什么在执行 int / 无符号 int 除法时使用 'divl'