主要内容

-logical-signed-right-shift

指定对有符号变量执行逻辑右移时如何处理符号位

描述

对负值执行右移位运算时在算术移位和逻辑移位之间进行选择。

此选项不会修改编译时表达式。有关更多详细信息,请参阅限制

设置选项

使用以下方法之一设置选项:

为何使用此选项

C99 标准(第 6.5.7 节)规定:对于右移位运算 x1>>x2,如果 x1 是有符号数并且具有负值,则行为由实现定义。不同的编译器会在算术移位和逻辑移位之间进行选择。使用此选项来模拟您的编译器。

设置

默认值:算术

算术

保留符号位:

(-4) >> 1 = -2
(-7) >> 1 = -4
  7  >> 1 = 3
逻辑

0 替换符号位:

(-4) >> 1 = (-4U) >> 1 = 2147483646
(-7) >> 1 = (-7U) >> 1 = 2147483644
  7  >> 1 = 3

限制

在编译时表达式中,此 Polyspace® 选项不会更改右移位的标准行为。

例如,考虑以下右移位表达式:

int arr[ ((-4) >> 20) ];
编译器会计算数组大小,因此表达式 (-4) >> 20 在编译时计算。从逻辑上,此表达式等效于 4095。但从算术上,结果为 -1。此语句会导致编译错误(数组大小不能为负值),因为有符号整数的标准右移位行为是算术移位。

命令行信息

当使用命令行时,算术移位为默认计算模式。设置此选项后,将执行逻辑计算。

参数:-logical-signed-right-shift
默认值:算术有符号数右移位
示例 (Bug Finder):polyspace-bug-finder -logical-signed-right-shift
示例 (Code Prover):polyspace-code-prover -logical-signed-right-shift
示例 (Bug Finder Server):polyspace-bug-finder-server -logical-signed-right-shift
示例 (Code Prover Server):polyspace-code-prover-server -logical-signed-right-shift