分配-0的任何理由?

qny*_*nyz 5 c integer lint numbers

我正在使用Lint查看一些旧的C代码,它偶然发现了这一行:

int16_t max = -0;
Run Code Online (Sandbox Code Playgroud)

Lint消息是"常量表达式在运算中评估为0" - "".

是否有人会使用-0?

The*_*kis 7

在C规范(6.2.6.2整数类型)中,它声明了以下内容(强调我的):

对于有符号整数类型,对象表示的位应分为三组:值位,填充位和符号位.不需要任何填充位; 应该只有一个符号位.作为值位的每个位应具有与相应无符号类型的对象表示中的相同位相同的值(如果在有符号类型中有M个值位且在无符号类型中有N,则为M£N).如果符号位为零,则不应影响结果值.如果符号位为1,则应以下列方式之一修改该值:

  • 符号位0的相应值被否定(符号和幅度);
  • 符号位的值为 - (2N)(二进制补码);
  • 符号位的值为 - (2N - 1)(一个补码).

这些适用中的哪一个是实现定义的,如符号位1和所有值位零(前两个),或符号位和所有值位1(对于一个补码)的值是陷阱表示还是正常值.在符号和幅度以及一个补码的情况下,如果该表示是正常值,则称为负零.

换句话说,C支持有符号整数的三种不同表示,其中两种具有有符号零的概念,它区分了正零和负零.

所以,我的解释是,你的代码片段的作者可能试图产生负零值.但是,正如Jens Gustedt的回答所指出的那样,这个表达式实际上不会产生负零,这意味着作者可能在那里做出了错误的假设.


Jen*_*edt 4

不,我看不出有什么理由。其他人提到,可以有带有“负零”的平台,但是这个表达式永远无法产生这样的负零,所以这是没有用的。

\n\n

C标准中对应的段落是6.2.6.2 p3,重点是我的:

\n\n
\n

如果实现支持负零,则只能通过以下方式生成它们:

\n\n

\xe2\x80\x94 &、|、^、~、<< 和 >> 运算符以及产生此类值的操作数;

\n\n

\xe2\x80\x94 +、-、*、/ 和 % 运算符,其中一个操作数为负零,结果为零;

\n\n

\xe2\x80\x94 复合\n 赋值运算符基于上述情况。

\n
\n\n

要在这样的平台上产生负零,您可以使用~INT_MAX,您可以使用 ,但这对于其他表示形式来说不是零,因此代码不太可移植。

\n