2015-10-15 75 views
1

我正在读的“代码牧场”,它讲述的变量此页面。已签名的原始数据为0肯定还是否定(或两者兼而有之)?

有人讨论“签订元,”并说,为0计数为负???

我一直以为是0在这些情况下,积极的?

所有这些整数类型的签名。最左边的位表示符号(正值或负值),不是值的一部分。例如,对于一个字节,您不会得到整个8位来表示您的价值。你得到7.这给你一个范围,字节为单位: (-2至7日)到(2〜7日)-1。为什么这个小-1到底?因为零在那里,零计数为负。和其他人一样工作。

http://www.javaranch.com/campfire/StoryCups.jsp

但看这个帖子的时候Why is the range of bytes -128 to 127 in Java?

一个注解中提到的 “0默认情况下是积极的。”它也谈到“Two's Compliment”,并且在最左边的位中提及'1'的任何东西都将是“负面的”,其中0不具有那个......

另外,如果0为负-128〜0为129个负片,127张正片,这没有任何意义....

所以我很好奇,如果这是一个错误,或者0是负的,为什么?

另外,我正在读此线程How can a primitive float value be -0.0? What does that mean?

这在谈论的-0.0价值浮动,并增加了“0.0”给它以使其“中性/正面” 0.0 .. ..

所以我很好奇,如果在彩车存在积极和消极的零,或者它在这两个浮点和整数元存在?????

此外,当我在谷歌上搜索这个答案,提“零既不正负/既是正负......”好奇,如果/当这适用于我们的语言?

感谢

+2

“算作否定”是什么意思?为什么这有关系? (从编程的角度来看) –

+0

零不是负面的,我同意这两个都没有关系。 – androiddev19

+0

对于大多数人来说,关于编程应用程序可能并不重要,但它可能在某个时候......? 无论哪种方式,他们传递这些信息为真的事实,对于他们的其他信息来说都不太好,因为这是一个长期存在的合法网站。 – XaolingBao

回答

1

这是与许多方面来,所以我要去尝试打破它,尽我所能的一个复杂的问题。

首先,这有零的数学概念,以及它是否是正还是负。不幸的是,答案本质上是依赖于上下文的,有时将零包含在一组正数或负数中是合理的。数学家承认的模糊性和对当他们需要清楚地了解零是否是在一个特定的组数字与否的一个专用名词 - “非负”和“非正面”既包括零。正面和负面的一些“常识”定义允许与零进行独家比较,这在特殊情况下不为正或负。其他人有一个正面或负面的包容性概念,可以使正面和负面都为零。 https://math.stackexchange.com/questions/26705/is-zero-positive-or-negative

那么这是什么意思为Java语言?同样,还有很多不同的情况需要考虑 - 原始整型,原始浮点型,装箱原型,任意精度类BigDecimal和BigInteger,最重要的是哪些效果可见?

Java使用2s complement系统表示原始整数类型,因此它只有一个表示零的单一表示。在0没有设置符号位的意义上,可以说0是正数。然而,这实际上是一个有争议的问题,因为语言中没有其他的东西是关于零是正面的还是负面的,所以它确实没有实际的效果。这些类型的盒装版本具有非常相同的行为。

然而,2的补码的意思是,任何给定的数字范围在零附近不均衡地平衡。所以,如果你采取8位值,你可以用它代表256个值。其中之一是0,这会给你留下255个非零值。然而,你将剩余的一方分成稍大于另一方的一方。 2的补码使-128成为一个有效的负值,127是可用8位表示的最大正值。对于较大的积分类型intlong也是如此 - 它们可以表示比非零正整数多一个非零负整数。这既不是一个错误也不是一个错误,这是一个简单的事实。

对于浮点原始类型,doublefloat,Java使用IEEE 754来代表他们。这允许表示0.0的两种不同的方式,因此,从技术上来说,每个零是-0.0或+0.0。然而,IEEE标准清楚地表明,这两个值实际上是无法区分的 - 它们是相等的,所以-0.0 == +0.0的计算结果为真。对于大多数数学运算,-0.0和+0.0具有相同的效果。直到你尝试一些产生Inf的东西。所以,除以-0.0会得到你 - 如果除以+0.0将得到+ inf。无论哪种方式你的计算已进入黑洞。幸运的是,所有的NaN都是相同的,所以-0.0/0.0会让你和南方的0.0/0.0完全一样。对于其他数学运算,-0.0始终如一。所以,Math.sqrt(-0.0)是-0.0,而Math.sqrt(0.0)是0.0。 Math.abs(-0.0)将返回0.0。但-0.0和0.0之间的差别非常小。

重要的是,当您在格式化的字符串中显示数字时,符号仍然存在。如果你真的关心它,那么你可以使用Math.abs()将一个“负”零变成一个“正”零,但这通常不是一个值得考虑的问题。

当涉及浮点数的盒装类型和'equals()'方法相关时,会产生奇怪的效果。原始类型有-0.0 == +0.0评估为true。然而Double.valueOf(-0.0).equals(Double.valueOf(+0.0))评估为false,这是documented,但反直觉,因此可能混淆。当与自动装箱和自动拆箱相结合时,这会产生一些令人困惑的副作用 - 例如, Double.valueOf(-0.0) == Double.valueOf(+0.0)是错误的,但-0.0 == +0.0为真。同时,Double.valueOf(-0.0) == +0.0d是真的。与Java一样 - 对盒装基元有点警惕,并且始终要小心混合盒装和未装盒的基元。

BigDecimal通过使用equals()稍微不同的实现而在作品中抛出了另一个扳手。所以,BigDecimal.valueOf(-0.0).equals(BigDecimal.valueOf(0.0))评估为真,但BigDecimal.valueOf(-0.0).equals(BigDecimal.ZERO)是错误的。这是因为规模与价值一起考虑。 BigDecimal.ZERO实际上是0,它被视为与0.0不同的值,它与0.00又有所不同 - new BigDecimal("-0.0").equals(new BigDecimal("-0.00"))的计算结果为false。

我们可以看到的另一件事是Math.signum()函数,它定义为返回-1,0或1,具体取决于参数是负数,零还是正数。java.math包中的BigIntegerBigDecimal类的signum方法也是如此。不幸的是,Math.signum()函数返回一个double,所以你得到-0.0为-0.0和0.0为0.0,而BigDecimal.signum()返回一个int。但是,什么signum意味着,然而你定义零,这不是真正的积极或消极的。

+0

我只想非常感谢你回复我,对不起,我花了这么长时间回复,我忘了我在这里回复。 我upvoted,并把它作为答案,但会在阅读后作出最终选择......虽然IT似乎有很多信息,所以我确信这将是我想要的:)。 – XaolingBao

相关问题