在以下程序中,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
变量不会打印负零?
答案 0 :(得分:8)
在数学整数集中没有负零。
一些很少使用的整数机器表示确实有多个零表示,在这种情况下,其中一个可能通常称为“负零”。但是,C ++语言不允许通过普通的整数API将这种表示暴露给程序员。因此,即使您的计算机有这样的表示,它可能没有,它也不会打印为-0。
另一方面,最常见的浮点数表示符号为零,C ++标准特别允许实现将符号公开给程序员。
答案 1 :(得分:4)
通常处理计算机中负整数的方法是使用two's complement对它们进行编码。使用两个补码,它不可能有负零。
答案 2 :(得分:2)
具有浮点的数字由符号,指数和分数组成。如果sign为1
,则其为负数,如果为0
,则为正数。
正如您在下面的示例中看到的那样
虽然计算机中的负数通常由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,只是在它的开头抛出减号。我希望这是有道理的