C++ 1'上负零的行为;什么是互补体系结构?

C++ 1'上负零的行为;什么是互补体系结构?,c++,c++11,integer,standards,ones-complement,C++,C++11,Integer,Standards,Ones Complement,在一个人的补充架构上考虑以下代码: int zero = 0; int negzero = -0; std::cout<<(negzero < zero)<<std::endl; std::cout<<(negzero <= zero)<<std::endl; std::cout<<(negzero == zero)<<std::endl; std::cout<<(~negzero)<<(

在一个人的补充架构上考虑以下代码:

int zero = 0;
int negzero = -0;
std::cout<<(negzero < zero)<<std::endl;
std::cout<<(negzero <= zero)<<std::endl;
std::cout<<(negzero == zero)<<std::endl;
std::cout<<(~negzero)<<(~zero)<<std::endl;
std::cout<<(1 << negzero)<<std::endl;
std::cout<<(1 >> negzero)<<std::endl;
intzero=0;
int negzero=-0;

std::cout首先,一个人的补码结构(甚至区分负零)非常罕见,这是有原因的。基本上(硬件方面)添加两个补码比添加一个补码更容易

您发布的代码似乎没有未定义的行为,甚至没有实现定义的行为,它可能不会导致负零(或者不应该与正常零区分)

负零应该不那么容易产生(如果您能够做到这一点,那么它最多只能是实现定义的行为)。如果它是一个互补的体系结构,它们将由
~0
(位反转)而不是
-0
生成

< > C++标准对基本类型的行为的实际表示和要求相当模糊(这意味着规范只处理数字的实际意义)。这意味着,在关联数字的内部表示和它的实际值时,基本上是运气不佳。因此,即使您正确地执行了此操作并使用了
~0
(或任何适合于实现的方式),标准似乎仍然不会对表示法产生任何影响,因为负零的值仍然是零

#define zero (0)
#define negzero (~0)
std::cout<<(negzero < zero)<<std::endl;
std::cout<<(negzero <= zero)<<std::endl;
std::cout<<(negzero == zero)<<std::endl;
std::cout<<(~negzero)<<(~zero)<<std::endl;
std::cout<<(1 << negzero)<<std::endl;
std::cout<<(1 >> negzero)<<std::endl;
#定义零(0)
#定义负零(~0)

标准::cout根据我对标准的解释:

在3.3.1/P3中的C++标准基本类型[Basic .Basic ]实际上将球投掷在C标准中:

有符号和无符号整数类型应满足约束条件 在C标准第5.2.4.2.1节中给出

现在,如果我们转到ISO/IEC 9899:2011第5.2.4.2.1节,它将向前引用§6.2.6.2/p2整数类型(强调我的):

如果符号位为零,则不应影响结果值。如果 符号位为1,应在其中一个位置修改该值 以下方法:

  • 符号位为0的对应值被取反(符号和 数量)

  • 符号位具有该值−(2^M)(二者的补充)

  • 符号位具有该值−(2^M− 1) (一人之补)

以下哪项适用于实现定义的,以及符号位为1的值和所有值位为零的值(对于前两个), 或带符号位和所有值位1(用于1的补码),是一个 陷阱表示或正常值对于符号和 数量级和1的补码,如果此表示为正态 该值称为负零。

因此,实现定义了负零的存在。

如果我们继续执行第3段:

如果实现支持负零,则应生成负零 只有:

  • 带有操作数的&、|、^、~、运算符,这些操作数产生 价值观

  • 一个操作数为负零的+、-、*、/、和%运算符 结果为零

  • 基于上述情况的复合赋值运算符

这些案例是否真的会产生负面影响尚不明确 零或正常零,以及负零是否成为正常零 存储在对象中时为零。

因此,未指定您显示的相关案例是否会生成负零。

现在在第4段继续:

如果实现不支持负零,则 带有操作数的&、|、^、~,运算符将生成 此值未定义


因此,相关操作是否会导致未定义的行为,取决于实现是否支持负零。

首先,您的第一个前提是错误的:

int negzero = -0;
应在任何一致的体系结构上生成正常的零

@101010的回答中给出了这方面的参考:

3.9.1基本类型[基本.基本]§3:

。。。有符号和无符号整数 类型应满足C标准第5.2.4.2.1节中给出的约束条件

后面的C参考: 5.2.4.2.1整型尺寸

。。。正向参考:类型表示(6.2.6)

及(C): 6.2.6类型表示/6.2.6.2整数类型§3

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

  • 带参数的&、|、^、~、运算符产生这样的值

  • +、-、*、/、和%运算符,其中一个参数为负零,结果为 零

  • 基于上述情况的复合赋值运算符

因此
negzero=-0
不是这样的构造,不会产生负0

对于以下几行,我将假定负0是在支持它的实现上以位方式生成的

C++标准根本不说负零,C标准只是说它们的存在依赖于实现。对于关系运算符或相等运算符,我找不到明确说明负零是否应等于正常零的段落

所以我将在C参考文献中引用:6.5.8关系运算符§6

每个操作员<(小于),>(大于)= 如果指定的关系为真,则(大于或等于)应产生1,如果为假,则产生0。92) 结果的类型为int

和C++ 5.9关系运算符[ExpR.Re] 5</P> 如果两个操作数(转换后)都是算术或枚举类型,则每个运算符都应

std::cout<<(1 << negzero)<<std::endl;
std::cout<<(1 >> negzero)<<std::endl;
std::cout<<(~negzero)<<(~zero)<<std::endl;
std::cout<<(negzero < zero)<<std::endl;
std::cout<<(negzero <= zero)<<std::endl;
std::cout<<(negzero == zero)<<std::endl;
std::cout<<(~negzero)<<(~zero)<<std::endl;
std::cout<<(1 << negzero)<<std::endl;
std::cout<<(1 >> negzero)<<std::endl;