【问题标题】:Is shifting the signed bit of a signed short undefined behaviour in C?是否在 C 中移动有符号短未定义行为的有符号位?
【发布时间】:2018-12-12 15:25:47
【问题描述】:

我听说转移到整数的有符号位,即

int test = INT_MAX;
test = (test<<1) + 1;

是由于测试大于 INT_MAX 而导致的未定义行为。但是这种行为会在有符号的短变量中遇到吗,即

short test1 = SHRT_MAX;
test1 = (test1<<1) + 1;

目前我还没有遇到任何相关文档。

编辑:我知道未定义的行为将导致整数的情况,但不是短的。

【问题讨论】:

  • @Sander 我不会称其为重复项,因为shorts 将在转移之前被提升为ints,这增加了额外的复杂性。
  • @interjay :足够公平 - 接近投票撤回
  • 幕后的问题是C移位运算符是一个'逻辑移位',这意味着它不关心符号处理 .整数之间的提升遵循众所周知的规则,在特定情况下,MAX_INT &gt;= MAX_SHORT 应始终为真,应保证shortint 中的正确表示。但是当涉及到转变时,行为取决于编译器编码的机器和特定指令。 IE。负数可以变为正数右移,左移相反。但是如果 CPU 使用 SAR/SAL 算术移位来代替呢?

标签: c undefined-behavior bit-shift integer-promotion


【解决方案1】:

当在大多数类型的表达式中使用小整数类型时,它是promotedint(如果int 可以适合原始类型的所有值),然后在@ 上执行表达式987654326@.

这提供了两种可能性:

  1. intshort 大小相同的平台上,移位将是未定义的行为,因为它会移位到int 的符号位。 (更准确地说,原因是结果不能表示为int)。见C11 6.5.7p4
  2. int 的位数比short 多的平台上,移位本身会成功(但如果移位超过1,它可能是未定义的)。但是,当您将结果分配回short 变量时,该值将无法表示为short。将分配的实际值是实现定义的。见C11 6.3.1.3p3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 2019-08-23
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多