按位移位将无符号字符提升为 int
bitwise shift promotes unsigned char to int
以下代码:
unsigned char result;
result = (result << 4 );
使用 gcc 版本 4.6.4 (Debian 4.6.4-2( 编译,带有 -Wconversion 标志的结果是警告
警告:从"int"转换为"无符号字符"可能会更改其值 [-Wconversion]
为什么?
因为标准是这么说的。 二元运算符的操作数进行整体提升,其中任何小于 int
晋升为int
;操作的结果有也键入int
。 如果原始值是,比如说, 0x12
,结果将是0x120
的,并将其分配给 unsigned char
将导致值发生变化。 (分配的值将为0x20
.( 警告从何而来。
编辑:
根据标准(§5.8 移位运算符(:"操作数应属于整型或无作用域枚举类型和整型进行促销。 结果的类型是提升左操作数。 与其他二元运算符不同,有无需努力从两个运算符中找到通用类型:结果类型是左操作数 Period。 但不可或缺促销仍然会发生:unsigned char
将是提升为int
unsigned int
(如果int
的大小为1(.
因为int
值可能大于unsigned char
所能容纳的。
想想当result
255
时会发生什么(即 0xff
(。将其向左移动四位将使其4080
(或0xff0
(。编译器如何能够将该值压缩回result
?它不能,所以它只是将其截断为240
(0xf0
(。换句话说,整数运算result << 4
的值可能会被更改。
所有算术和逻辑运算符都对其参数执行"积分提升"。整体促销将小于int
的类型(如unsigned char
(转换为int
或unsigned int
。如果将<<
替换为 +
,您将看到相同的内容。
哦,不需要括号。
相关文章:
- 如何在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'