2014-01-16 15 views
-6

編譯器使用什麼方法來存儲數字?一個字符是0-255。兩個並列字符是0-255255。在C++中,一個短是2個字節。大小是0-65535。現在,編譯器如何將255255轉換爲65535以及在無符號數中會發生什麼?數字如何存儲?

+0

這不是255255,它是(255 * 2^8)+255. –

+0

http://en.wikipedia.org/wiki/Binary_number – Roddy

+0

http://en.wikipedia.org/wiki/Integer_%28computer_science%29 –

回答

2

你有完全錯誤的數學。下面是它真的是

,因爲每一位只能採取兩種狀態只(1和0),n位作爲一個整體代表2^n個不同數量不是數字。當處理整數時,2個字節的標準短整數可以表示2^n - 1(n = 16,如65535),爲了簡化計算,它們被映射到實際的十進制數。
當處理2個字符時,它們是兩個獨立的實體(字符串是一個字符數組)。如果你閱讀的是一個字符串,那麼整體上閱讀這兩個字符的方法有很多種,那麼它將與兩個單獨的字符並排相同。讓我給你一個例子:
記住,我將使用十六進制符號爲簡單!
如果您有疑問映射ASCII字符爲十六進制看看這個ascii to hex

爲簡單起見,我們假設存儲在兩個相鄰位置的字符都是A.
對於A現在十六進制代碼是0x41即在內存會是什麼樣子

1字節.......第2個字節

如果你從內存作爲閱讀本串,並打印出來,那麼輸出將是
AA

,如果你要閱讀整個2個字節爲一個整數然後這將代表

0 * 2^15 + 1 * 2^14 + 0 * 2^13 + 0 * 2^12 + 0 * 2^11 + 1 * 2^10 + 0 * 2^9 + 0 * 2^8 + 0 * 2^7 + 1 * 2^6 + 0 * 2^5 + 0 * 2^4 + 0 * 2^3 + 0 * 2^2 + 0 * 2^1 + 1 * 2^0

= 17537

如果使用無符號整數,那麼2個字節的數據將被映射爲 0和65535之間的整數,但是如果相同表示有符號值,那麼儘管範圍保持相同,但可以表示的最大正數將會是32767.這個值將介於-32768和32767之間,這是因爲所有的2個字節都不能被使用,最高位被留下來確定符號。 1代表負數,2代表正數。

還必須注意,類型轉換(兩個字符改爲單個整數)可能並不總是給你想要的結果,尤其是當你縮小範圍。 (實施例一雙人間精度浮點數轉換爲整數。)



更多上看到此答案double to int
希望這有助於。

4

可以用n位存儲的最大值(當最低值爲0並且所表示的值爲連續範圍時)是2ⁿ - 1。對於8位,這給出了255.對於16位,這給出了65535

你的錯誤認爲你可以連接255和255來獲得兩個最大值char s - 這是絕對錯誤的。相反,要從8位(256)到16位(範圍),您可以使用256×256 = 65536.由於我們的第一個值爲0,最大值再次爲65535。

。注意,char只保證有至少 8位和一個short至少16位(和必須至少大如char)。

+0

'char'不保證有8位。我見過9位'char',我聽說一些現代機器有16或32位'char'。 –

+0

@JamesKanze出於某種原因,我認爲'CHAR_BIT'必須正好是8,即使它與USHRT_MAX處於相同或者更大的列表中。謝謝。 –

+0

也沒有保證(除了'unsigned char')所有的位都參與了這個值。在至少一臺機器上(仍在生產中),「int」是48位,但只有40位被使用。 –

2

使用十進制時,一個數字的範圍是0-9,兩個數字的範圍是0-99。當使用十六進制系統時,同樣的事情也適用,但是你必須在十六進制系統中進行數學運算。一個十六進制數字的範圍是0-Fh,兩個十六進制數字(一個字節)的範圍是0-FFh。兩個字節的範圍是0-FFFFh,並且這將在十進制系統中轉換爲0-65535。

+0

+1捕捉他們可能想到的內容。 –

2

十進制是一個基數爲10的數字系統。這意味着從右到左的每個連續數字代表10的遞增功率。例如,1233 + (2*10) + (1*100)。你可能不會在日常生活中用這些術語來思考它,但這就是它的工作原理。

現在你從十進制(base-10)到二進制(base-2)採用了相同的概念,現在每個連續的數字是2的冪,而不是10.因此11000 + (0*2) + (1*4) + (1*8)

現在讓我們取一個8位數字(char);在這個數字中有8位數字,所以最大值是255(2**8 - 1)或其他方式,11111111 == 1 + (1*2) + (1*4) + (1*8) + (1*16) + (1*32) + (1*64) + (1*128)

如果還有8位可用於創建16位值,則只需繼續計數2的冪;你不只是「粘」兩個255s在一起,使255255。所以最大值是65535,或另一種方式,1111111111111111 == 1 + (1*2) + (1*4) + (1*8) + (1*16) + (1*32) + (1*64) + (1*128) + (1*256) + (1*512) + (1*1024) + (1*2048) + (1*4096) + (1*8192) + (1*16384) + (1*32768)

1

它取決於類型:整數類型必須以二進制形式存儲(或至少,對於C++程序來說是這樣),因此每個二進制數字有一個位 。除了極少數例外,所有的位都是 重要的(雖然這不是必需的,並且 至少有一臺機器,其中int中有額外的位)。在 一個典型的機器上,char將是8位,如果不是 有符號,可以存儲值在[0,2^8)範圍內;換句話說,在0和255之間(含)的 。 (範圍[0,2^32)) 和unsigned long的32位或64位。

對於有符號值,您必須至少使用 位中的一個作爲符號,從而減少最大正值。負值的 確切表示可以變化,但在大多數 機,這將是2的補數,因此,範圍將是 signed char: [-2^7,2^7-1)`等

如果你不熟悉基礎二,我建議你很快學會 ;所有現代機器如何儲存 數字都是至關重要的。你應該找出2的補碼: 通常的人類表示被稱爲符號加上幅度,並且在計算機中是非常少見的 。