[英]In C language how numbers are represented internally
我是C語言的初學者,我有一條類似的聲明:
printf("%d",(1^6));
得出答案為7
。 我知道^
是xor運算符。 我在這里假設 1
用4位表示,例如0001
而6
用0110
。 進行xor運算得出的結果為0111
,即7
。
我的假設是正確的嗎? 用C語言如何在內部表示數字?
提前致謝。
這里有兩個略有不同的事情要考慮。
C語言標准說文字1
和6
具有類型int
,因此將使用int
類型執行XOR操作。
C語言標准還說, int
類型具有二進制表示形式,值位以從2的冪開始從最小到最高有效,外加一個符號位,在這里不相關,因為數字都是正數,另外還可以選擇一些填充位(並且我從未使用過int
中具有任何填充位的C實現)。
所以在這些方面,你是對的: 1
被表示為二進制的1
, 6
表示為二進制的110
, 7
是111
,再加上有初始0足以彌補類型的大小int
。 寫二進制數時,即使知道類型為32位,我們也很少去寫00000000000000000000000000000001
。
在大多數實現中, int
的值+符號位的數量為32。 您可能偶爾會看到64甚至16。該標准至少需要16個字符,但是超過了它允許的任何數字。
一個int
通常占用多個字節的存儲空間。 標准沒有說最低有效位是占據第一個(最低地址)字節,還是最后一個(最高地址)字節,還是居中。 因此,它既可以使用小尾數表示法,也可以使用大尾數表示法,並且在理論上還可以使用“中尾數”表示法(我從來沒有見過其中一種,至少對於int
)。 字節序與內存中int
的表示形式有關,但與按位操作(包括XOR)無關,后者按位的順序是有意義的,而不是按其在內存中的順序來定義。
這些都在標准中,但是該標准還說,它僅描述了“抽象機器”的行為。 您的編譯器實際執行的操作必須具有與標准所說的結果相同的結果,但是不需要任何給定的代碼片段即可在程序運行時在內存中看到這些確切的表示形式。 編譯器為您的行發出與printf("7");
相同的代碼是完全合法的printf("7");
甚至fputc('7', stdout);
,如果需要的話。 因此,在發出的代碼中可能沒有任何1
表示形式。
也許只會優化到printf("%d", 7);
,如果將printf
實現為庫的一部分,並且編譯器無需擔心"%d"
對該庫的含義。 也許它將在運行時進行計算,但是表示為1
但是它認為對於目標CPU來說是最緊湊和/或最有效的,只要編譯器首先證明自己滿意,即不同的大小將產生相同的結果。 例如,某些指令集允許所謂的“立即值”,它們是作為指令一部分存儲的小整數。 1
的表示形式仍然是一定數量的0,最后是1,但是由於立即數必須適合指令內部,因此它們通常小於int
。
這種事情的確切細節取決於您的編譯器,目標體系結構,優化級別以及可能的其他編譯器選項。
數字(或更確切地說是-values )表示計算機的構建方式。 如果計算機是使用4位字構建的-那就是您所描述的。 現代計算機每個字使用32或64位,並且有大尾數表示法。
同樣,分數的表示形式千差萬別,並且有幾種不同的標准。
這在各種編程語言之間也可能有所不同(盡管大多數使用類似的約定和標准)。
最終,它全部縮減為位和字節。
整數所代表的位數取決於您的體系結構-例如32或64位。
數字1是一個整數,因此在32位體系結構中由4字節或32位表示。
由於C不是一種解釋型語言,因此不存在整數(或浮點數或字符)的“內部表示形式”。 C語言標准中有一些規則,用於限制或定義不同類型必須具有多少位以及與該語言中其他類型相比必須具有的最小位數。
最后,您的體系結構會影響整數在執行過程中將具有的位數。 在這種情況下,僅用8位就足夠了,但是您需要檢查所生成的機器代碼/匯編程序以確保。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.