C++ 浮点数在计算机中的表示

2024年11月18日 05:52
有4个网友回答
网友(1):

"最高位1为负0为正"这句断章取义的话迷惑了好多人,应当说,表示负数时最高位为1,表示正数时最高位为0,或者说用最高位为1来表示负数而用最高位为0来表示正数。似乎后者与前者没有什么区别。其实区别在于后者是说先有数的正负,才有正负数的表示方法,而前者就理解为只要最高位为1就是负数——这就太机械了。计算机中的数有有符号数,有无符号数。有符号数最高位为1时才表示负数,无符号数无论最高位是1或0都理解为正数——这也是计算机语言通常都要声明数的类型的重要原因之一。另外计算机语言中的数都是有定长的,一般说的最高位是指定长的最高位,比如int型是32位,那么只有第31位才称作“最高位”。因为10000010只有8位,所以若看做是char型那是-126,若是unsigned char型那是130。

网友(2):

这要看这个数据类型在内存中占多少字节,假设是2个字节,也就是16位,那么130的二进制表示应该是
0000 0000 1000 0010
因为130是正数,所以它的原码、反码和补码都是一样的
若是-130,则它的原码表示为
1000 0000 1000 0010
反码为
1111 1111 0100 1101
补码为
1111 1111 0100 1110
最高位用来表示符号位,在计算反码和补码的时候是不参加运算

网友(3):

你忽略一件事,就是byte的范围是8位,能表示的范围是-128——127,你说的130不在讨论范围之内

网友(4):

符号位的设立,就造成了原码反码的错误。

零,本来只有一个,原码反码,却都弄了正零和负零两个代码。

这就违反了一一对应的常规。

况且,八位的原码反码,都不能表示-128,而-128 却有补码。

就因为这些缺陷,原码和反码,在计算机中,都无法使用。

所以,在计算机系统中,数值,一律采用补码表示和存储。

其实,部补码的来源,并非来自于“符号位原码反码取反加一”。

从符号位开始讲解补码,就不能正确说明补码的意义。

---------------------------

补码,其实是一个“代替负数”的正数。

使用补码(正数)代替负数,在计算机中,就没有负数了,而且,也就没有减法运算了。

从而,计算机的硬件,就可以简化了。

一个正数(即补码),怎么就能代替负数呢?

这是因为计数系统的周期性,所导致的。

时针,倒拨 3 小时,可以用正拨 9 小时来代替。

  +9 = -3 + 周期 12。

  如果是分针,周期,就是 60。

两位十进制数(0~99),周期就是 10^2 = 100。

  25 - 1 = 24

  25 + 99 = (一百) 24

  舍弃进位,只取 2 位,正数(+99),就可以代替负数(-1)。

三角函数也有周期性。

  -π/2 和 +3π/2,也是借助于周期 2π,进行的等效变换。

计算机中,一个字节是 8 位 2 进制数。其计数周期就是 2^8 = 256。

  补码(正数)=负数 + 周期 256。

-1 的补码就是:-1 + 256 = 255 = 1111 1111 (二进制)。

-2 的补码就是:254 = 1111 1110 (二进制)。

。。。

-126 的补码就是:130 = 1000 0010 (二进制)。

-127 的补码就是:129 = 1000 0001 (二进制)。

-128 的补码就是:128 = 1000 0000 (二进制)。

正数,不需要变换,也不许变换,必须直接参加运算。

所以,正数,根本就没有补码。

------------------------

讨论补码时,千万不要牵扯到“符号位原码反码取反加一”。

用“取反加一”来求补码,就不能理解【补码的意义】。

老外数学不好,没有正确的思路,编造了这一滩垃圾,这也不奇怪。