在一个不支持负零的系统中产生负零有什么意义? [英] What is the meaning of "producing negative zeroes" in a system that doesn't support it?

查看:20
本文介绍了在一个不支持负零的系统中产生负零有什么意义?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

C17 6.2.6.2/4表示:

如果实现不支持负零,则&;、|、^、~、<;<;的行为, And>>运算符的操作数将生成这样的值,这是未定义的。

如果我有一个2的补码系统,它不支持负零。它总是利用二进制数的所有可能组合来表示值。因此,无论使用哪种位运算,都不可能生成负零。那么这篇文章的意思是什么呢?

我的看法是,这部分指的是具有1的补码或带符号幅度的系统,这些系统不支持负零,而是使用填充比特或陷阱表示法。这样做正确吗?

推荐答案

您的解释是正确的。

转到6.2.6.2的第2段:

对于带符号整数类型,对象的位 表示应分为三组:值位, 填充比特和符号比特。不需要有任何 填充比特;有符号字符不能有任何填充比特。 应该正好有一个符号位。每一位都是一个 值位应与 相应无符号类型的对象表示形式(如果有 有符号类型中的M值位和无符号类型中的N,然后是M≤N )。如果符号位为零,则不应影响结果 价值。如果符号位为1,则修改该值 以下列方式之一:

  • 符号位为0的对应值被取反(符号和幅值);
  • 符号位的值为−(2M)(二进制补码);
  • 符号位的值为−(2M−1)(一的补码)。
这些应用中的哪一个是由实现定义的,是否 符号位为1且所有值位为零的值(对于第一个 二),或具有符号位和所有值位1(对于1 补码),是陷阱表示或正常值。在……里面 符号、幅度和一的补码的情况,如果是这样的话 表示为正常值,称为负零。

这意味着,对于给定的大小整数类型,使用补码或符号和幅度的实现具有特定的表示形式,该表示形式必须为负零或陷阱表示形式。然后由实现来选择应用其中的哪一个。

例如,假设系统具有符号和幅度表示以及没有填充32位int。则将为负零的表示(如果支持)为0x80000000

现在假设执行以下操作:

 int x = 0x7fffffff;
 x = ~x;

如果实现支持负0,则~运算符将生成-0作为结果并存储在x中。如果没有,它将创建一个陷阱表示,并根据第4段调用未定义的行为。

这篇关于在一个不支持负零的系统中产生负零有什么意义?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆