c - 是否在 C 中移动有符号短未定义行为的有符号位?
问题描述
我听说转移到整数的有符号位,即
int test = INT_MAX;
test = (test<<1) + 1;
由于测试大于 INT_MAX 是未定义的行为。但是这种行为会在有符号短变量中遇到,即
short test1 = SHRT_MAX;
test1 = (test1<<1) + 1;
?
目前我还没有遇到任何相关文件。
编辑:我知道未定义的行为将导致整数的情况,但不是短的。
解决方案
当在大多数类型的表达式中使用小整数类型时,将其提升为int
(如果int
可以适合原始类型的所有值),然后在int
.
这提供了两种可能性:
int
在与 大小相同的平台上short
,移位将是未定义的行为,因为它会移位到int
' 符号位。(更准确地说,原因是结果不能表示为int
)。见C11 6.5.7p4。- 在
int
位数多于的平台上short
,移位本身会成功(尽管如果移位超过 1,它可能是未定义的)。但是,当您将结果分配回short
变量时,该值将无法表示为short
. 将分配的实际值是实现定义的。见C11 6.3.1.3p3。
推荐阅读
- c# - 如何在 MVC 上执行编辑以保持某些值的唯一性?
- ruby-on-rails - 如何在 Rails 中制作动态引导轮播?
- c - 在 C 编程中将 .h 文件实现到 main() 中
- sql-server - SSIS - 数据查看器不显示派生列
- java - 使用 listIterator 遍历和替换 Char 值的双链表
- google-chrome - 在远程调试窗口调整 Chrome DevTools 的停靠位置
- xslt - XSLT:在带有子节点的文本上分析字符串
- c++ - 在命名空间类中使用 EnumWindows
- javascript - 处理长文本的聪明方法
- vtd-xml - XML VTD 根据属性值拆分 xml