摘录:来自justjavac(迷渡)——代码之谜


第一章:ide

C中为何能够i = i + 1?由于=是赋值,注意这只是在大部分语言中这样,好比ST语言就是:=。因而既然=若是不是相等的话,那确定有表示相等的,好比==或者===。无论是==仍是=,「相等」究竟是什么意思呢?=或者==或者===,即便之后会出现====,到底和数学的「相等」有多少出入呢?spa

NaN(通常表示Not A Number),NaN是在IEEE浮点数规范中明肯定义的,包括本系列后面 后提到的+0和-0问题),它不等于任何值,并且,它竟然不等于它本身。翻译

一个数竟然不等于它本身,其实确切的说,是 NaN == NaN 竟然返回 false, 甚至 NaN === NaN 也返回 false。是NaN 的问题,仍是==或者===的问题,抑或这根本就是相等这个概念的问题。数学

在集合论中,相等的三要素,无论是==仍是===,都没法知足,因此说,===根本就不是相等(若是你读过数学的「群伦」就更明白了)。it

相等(等价)的三要素class

1. 自检讨: A等于A原理

2. 对称性: 若是A等于B,那么B等于Aim

3. 传递性: 若是A等于B,并且B等于C,那么A等于C异常


说通俗一点,之前的全部定理、公理都只适用于一个领域,当它进入另外一个领域咱们就不能把它看成理所固然的,也许它没有问题,好比1+2=3,但也许这只是一个巧合, 上面我就提到了 0.2+0.4 就不等于 0.6。计算机

计算机和现实最大的不一样(也是问题的根源)就是,世界是连续的,而计算机是非连续的,是离散的。


第二章:

整数(8bit)的表示范围是多少?”,(也许你已经把教科书的知识背下来了,是 -2^7 到 2^7 - 1,也就是 -128 到 +127。那么这里就有一个颇有意思的问题了,0既不是正数也不是负数,把0去掉的话,整数的个数就是奇数了,整数还剩255 个。 奇数个整数不可能平均分红两部分(正数和负数),要么负数多一个,要么正数多一个。事实就是,负数比正数多一个,最小的负数是 -128, 最大的整数是 127。


如今的问题是, -128 的绝对值是多少呢? -(-128)等于多少呢?是溢出呢,仍是等于它本身呢?也许计算机课本没有告诉你, 整数是不会出现溢出异常的,整数的溢出被认为是正常的舍弃(其实只要很合理)。整数只有被0除才会异常,而浮点数,即便被0除也不会抛出异常。

绝对值等于本身的数有两个,0 和最小的负数。


在经典数学中,绝对值定义为:“从原点到点A的距离,称为A的绝对值,它是一个非负数”。两个数的大小在数学中如何定义,“距离数轴原点的距离远近”,计算机中大小如何定义的呢?abs(x) := (x >= 0) ? x : -x   翻译过来就是,x的绝对值定义为:正数和0的绝对值等于它本身,负数的绝对值等于-x。(这里使用的是-x,而没有用0-x,由于在浮点数中,这二者是有区别的。)


-x 是如何计算的呢?学过计算机原理的都知道,负数在计算机中以补码形式存储,计算补码的方式和取反操做相似。符号位不变,其它位取反,最后加一。


最小的负数在计算机中表示为 1000,000,下面咱们对这个数操做

补码: 1000,0000

各位取反: 0111,1111

加一: 1000,0000

神奇吗,尼玛,竟然又回到本身了。

相关文章
相关标签/搜索