移位运算符如何影响无符号数字
How does shift operators affect unsigned numbers
假设x
是无符号的int
则x << n
等于x * 2n
我知道有符号整数也是如此。
x * 15
等于x << 4 - x
吗?
这个答案是针对 C 语言的。对于这个特定问题,C++规范似乎存在细微差异。
如果x
是无符号的,并且n >= 0
且小于x
类型的值位数,则x << n
确实等于将x
乘以 2 的第 n 次方。
如果此计算溢出,则结果将模数减少为x
加 1 类型的最大值。
如果x
是签名的,它必须是非负数,结果不得溢出,否则您将获得未定义的行为。在 32 位体系结构上,未定义行为的常见情况如下:
unsigned x = 1 << 31; /* undefined behavior: 1 is signed, 31 is too large */
正确的版本是:
unsigned x = 1U << 31; /* correct on 32 bit architectures */
顺便说一下,自C++14以来,C++标准对这种情况有具体规定:
如果a << b
的值在返回类型的无符号版本中可表示(然后将其转换为有符号:这使得创建INT_MIN
作为1 << 31
是合法的(,则 2 B 的值是乘以 2b,否则行为是未定义的。
关于你的第二个问题,x * 15
等于x << 4 - x
吗?
答案是否定的,因为x << 4 - x
被解析为x << (4 - x)
.
如果你用括号括起来你的表达式,那么确实x * 15 == (x << 4) - x
.
但请注意,对于有符号值,它不正确,因为中间结果x << 4
可能会溢出较大的x
值,而x * 15
的结果不会溢出。
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 将无符号char*转换为std::istream*C++
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存
- 如何打印boost多精度128位无符号整数
- C++模板函数,用于比较任何无符号整数和有符号整数
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 获取隐式转换溢出从无符号到已签名的警告
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 从 std::vector<无符号字符>切片中提取 int?
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- 无法在 Arduino 中uint8_t数组转换为无符号长整型数组
- 将无符号字符的向量存储在数组中会给我 std::bad_alloc
- 使用 fopen 打开 .pak 文件并使该文件应用于 const 无符号字符* (C++)
- C4018:类内有符号、无符号不匹配
- C++无符号短裤的划分导致 int
- 移位运算符如何影响无符号数字