c++ - 对移位行为的怀疑
问题描述
我想澄清一些关于位移的疑虑:
使用
unsigned int
:unsigned int i = 500;
i << 24;
据我所知,这会导致
unsigned int
溢出,这完全没问题吗?
C++17 (8.5.7/2) - E1 << E2 的值是 E1 左移 E2 位位置;空出的位用零填充。如果 E1 具有无符号类型,则结果的值为 E1 × 2^E2,比结果类型中可表示的最大值多模一减少。
signed int
只要我的移位小于“32 位”,就可以很好地使用右移,因为“int”在我的平台上是 32 位。int i = 500;
i >> 31;
那是溢出吗?
C++17 (8.5.7/3) E1 >> E2 的值是 E1 右移 E2 位的位置。如果 E1 具有无符号类型或 E1 具有带符号类型和非负值,则结果的值是 E1/2^E2 的商的整数部分。
解决方案
-
这完全没问题吗?
是的。
i
将变为4093640704
十六进制0xf4000000
。 -
那是溢出吗?
不,这是一个右移(类似除法的操作),所以
i
会变为零。
请注意,关于班次的规则很可能会发生变化。目前,有几种情况是未定义的行为或定义的实现。由于下一个标准将需要二进制补码算法,因此有关移位的规则将放宽:唯一未定义的行为将是,如果移位量大于或等于类型的宽度。以下是当前的规则草案:链接。
推荐阅读
- node.js - 如何使用 apollo 服务器从服务器设置响应标头?
- vert.x - Single 的 Vert-x RxJava Map 实现与 HttpResponse::body 参数不匹配
- r - 比较向量的名称并选择常见的并将值相加
- javascript - 通过递归检查每个字符串编号
- java - Java 正则表达式查找或替换第一次出现而不丢失尾部文本
- sql - 我想通过 cdValuse 选择相同的 Table 相同的列来分隔 Desc_Main 和 Desc_sup
- mysql - 用于计数和显示(列中的不同值)的 Sql 查询优化,按其他两列分组
- python - 如何从字符串中找到多字字符串,并在python中标记它?
- java - BottomAppBar 抛出 IllegalArgumentException
- javascript - Node.js 相当于:echo 'message' | 数控-v