private static void m1() { int a = 999999999 * 9; int b = 999999999 * 8; System.out.println(a > b); System.out.println(b - b >0); }
結果是true、false;
現代計算機儲存和處理資訊現代計算機儲存和處理以二值訊號表示的資訊。這些普通的二進位制數字,或者位(bit),形成了數字革命的基礎。大家熟悉的使用了1000多年的十進位制(以十為基數,base-10)起源於印度,在12世紀被阿拉伯數學家所改進,並在13世紀被義大利數學家 Leonardo pisano(更有名的叫法是Fibonacci)帶到西方。使用十進位制表示法對於有十個指頭的人類來說是很自然的事情,但是當構造儲存和處理資訊的機器時,二進位制值工作得更好。二值訊號能夠很容易地表示、儲存和傳輸,例如可以表示為穿孔卡片上有洞或無洞、導線上的高電壓或低電壓,或者磁場引起的順時針或逆時針。基於二值訊號的儲存和執行計算的電子電路非常簡單和可靠,使得製造商能夠在一個單獨的矽片上整合百萬個這樣的電路。
單獨地來說,單個的位置不是非常有用。然而,當我們把兩位組合在一起,再加上某種解釋( Interpretation),即給予不同的可能位模式以含意,我們就能夠表示任何有限集合的元素。比如,使用一個二進位制數字系統,我們能夠用位組來編碼非負數。透過使用標準的字元碼,我們能夠對一份文件中的字母和符號進行編碼。在本章中,我們將討論這兩種編碼,以及表示負數的編碼和近似實數的編碼我們考慮三種最重要的數字編碼。無符號( unsigned)編碼是基於傳統的二進位制表示法的,表示大於或者等於零的數字。二進位制補碼(two's- complement)編碼是表示有符號整數的最常見的方式,有符號整數就是為正或者為負的數字。浮點數( floating-point)編碼是表示實數的科學記數法的以二為基數的版本。計算機用這些不同的表示方法實現算術運算,例如加法和乘法,類似於相應的整數和實數運算。
浮點運算有完全不同的數學屬性。雖然溢位會產生特殊的值+∞,但是一組正數的乘積總是正的。另一方面,由於表示的精度有限,浮點運算是不可結合的。例如,在大多數機器上,C表示式(314+1e20)-1e20求得的值會是0.0,而3.14+(le20-l20)求得的值會是3.l4透過研究實際數字的表示,我們能夠了解可以表示的值的範圍和不同算術運算的屬性。對於編寫在全部數值範圍內都能正確工作,而且可以跨越不同機器、作業系統和編譯器組合的可移植的程式來說,這種瞭解是非常重要的。
資訊的儲存大多數計算機使用8位地塊,或叫做位元組(byte),來作為最小的可定址的儲存器單位,而不是訪問儲存器中單獨地位。機器級程式將儲存器視為一個非常大的位元組陣列,稱為虛擬儲存器( virtualmemory)。儲存器的每個位元組都由一個惟一的數字來標識,稱為它的地址( address),所有可能地址的集合就稱為虛擬地址空間( virtual address space)。正如它的名字表明的,這個虛擬地址空間只是個展現給機器級程式的概念性映像( Image)。實際的實現(見第10章)使用的是隨機訪問儲存器RAM、磁碟儲存、特殊硬體和作業系統軟體的結合,來為程式提供一個看上去統一的位元組陣列。編譯器和執行時系統的一個任務就是將這個儲存器空間劃分為更可管理的單元,來存放不同的程式物件( program object),也就是,程式資料、指令和控制資訊。有各種機制可以用來分配和管理程式不同部分的儲存。這種管理完全是在虛擬空間裡完成的。例如,C中一個指標的值(無論它指向一個整數、一個結構或是某個其他程式單元)都是某個儲存塊的第一個位元組的虛擬地址。C編譯器還把每個指標和型別資訊聯絡起來,這樣它就可以根據指標值的型別,生成不同的機器級程式碼來訪問儲存在指標所指向位置處的值。儘管C編譯器維護著這個型別的資訊,但是它生成的實際機器級程式並沒有關於資料型別的資訊。它簡單地把每個程式物件視為一個位元組塊,而將程式本身看做一個位元組序列。
字的概念很多人工作久了以後,就對字(bit),位元組(byte),有些忘了,或是一些非計算機專業的轉行者,根本都沒有這塊的概念。
每臺計算機都有一個字長( word size),指明整數和指標資料的標稱大小( nominal size)。因為虛擬地址是以這樣的字來編碼的,所以字長決定的最重要的系統引數就是虛擬地址空間的最大大小。也就是說,對於一個字長為n位的機器而言,虛擬地址的範圍為0~2-1,程式最多訪問2n位元組。今天大多數計算機的字長都是32位。這就限制了虛擬地址空間為4千兆位元組(寫作4GB),也就是說,剛剛超過4×10位元組。雖然對大多數應用而言,這個空間足夠大了,但是現在已經有許多大型的科學和資料庫應用需要更大的儲存了。因此,隨著儲存器價格的降低,字長為64位的高階機器正逐漸變得普遍起來。
資料大小計算機和編譯器使用不同的方式來編碼數字,比如不同長度的整數和浮點數,從而支援多種數字格式。比如,許多機器都有處理單個位元組的指令,也有處理表示為兩位元組、四位元組或者八位元組整數的指令,還有些指令支援表示為四位元組和八位元組的浮點數。
那麼案例裡的JAVA語言的int型別的長度是多少呢?如下圖,4個位元組。
4個位元組,也就是4*8=32位,2的31次方減去1,就是2 147 483 647。這是他的大小的計算方式。我們示例裡的計算後的值,會超過這個數得到的是一個負值。這就是我們看到這個結果的原因。編寫不易,關注支援一下哦,下個接著這裡寫寫計算的定址和位元組順序。