为什么" int"变量不会打印负零?

时间:2017-08-21 05:48:48

标签: c++ types floating-point int

在以下程序中,float变量打印负零。

//g++  5.4.0

#include <iostream>

int main()
{
    float val = 0;
    val = -val;

    std::cout<<val<<std::endl;
}

输出:

-0

但是,在下面的代码中

//g++  5.4.0

#include <iostream>

int main()
{
    int val = 0;
    val = -val;

    std::cout<<val<<std::endl;
}

输出:

0

打印正零。

为什么int变量不会打印负零?

4 个答案:

答案 0 :(得分:8)

在数学整数集中没有负零。

一些很少使用的整数机器表示确实有多个零表示,在这种情况下,其中一个可能通常称为“负零”。但是,C ++语言不允许通过普通的整数API将这种表示暴露给程序员。因此,即使您的计算机有这样的表示,它可能没有,它也不会打印为-0。

另一方面,最常见的浮点数表示符号为零,C ++标准特别允许实现将符号公开给程序员。

答案 1 :(得分:4)

通常处理计算机中负整数的方法是使用two's complement对它们进行编码。使用两个补码,它不可能有负零。

答案 2 :(得分:2)

具有浮点的数字由符号,指数和分数组成。如果sign为1,则其为负数,如果为0,则为正数。

正如您在下面的示例中看到的那样

enter image description here

虽然计算机中的负数通常由twos complement处理,但如果数字具有最高位1,则必须将其从二进制补码转换为实际值。例如,8位。

+---+---+---+---+---+---+---+---+
| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
+---+---+---+---+---+---+---+---+

第一步:反转位

+---+---+---+---+---+---+---+---+
| 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
+---+---+---+---+---+---+---+---+

第二步:添加1

+---+---+---+---+---+---+---+---+
| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
+---+---+---+---+---+---+---+---+

第三步:更改标志

结果是-128

换句话说,你不能补充-0

答案 3 :(得分:1)

那是因为int和float的二进制表示彼此不同。

int由32位组成,最重要的是符号位。当符号位为真时,int的最高可能值为11111111111111111111111111111111,即-1。所以负零是不可能的。

另一方面,有符号浮点数分为三部分 - 符号,指数和尾数(分数)。因此,当分数部分等于零时,整数等于零。当你切换符号位(这基本上就是你在val = -val所做的那样)时,这个数字在技术上仍然是零,但当你告诉cout将这个数字转换成一串十进制数字时,你可以读,它看到符号位设置为1,只是在它的开头抛出减号。我希望这是有道理的