【发布时间】: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 >= MAX_SHORT应始终为真,应保证short在int中的正确表示。但是当涉及到转变时,行为取决于编译器编码的机器和特定指令。 IE。负数可以变为正数右移,左移相反。但是如果 CPU 使用 SAR/SAL 算术移位来代替呢?
标签: c undefined-behavior bit-shift integer-promotion