字面量和整數字面量

2021-10-03 04:33:03 字數 3274 閱讀 4402

字面量是指c/c++源**中直接使用的常量,字面量的意思是「一眼看上去是什麼就是什麼」。例如語句 int x = 10; 中10就是字面量,它相對於變數,只有乙個確定的值不能改變,這個值就是它看上去的值。

c/c++中的字面量有一下幾種:

1.0和正整數,如10、123等(負整數不是字面量,因為加了-運算子)

2.浮點數,如1.23

3.單個字元,如』a』、『c』

4.多個字元,如』abc』、『abcd』(至少乙個字元、至多四個字元)

5.字串,如"abcdefg"(可以是空串"")

將字面量解釋成何種型別的值使用編譯器決定的,通常也決定了這個值如何轉化為二進位制串儲存到計算機中。

c/c++中,整數型別有以下幾種:

1.char

2.short

3.int

4.long

5.long long

型別決定了計算機將用用多少二進位制位表示這個整數值也就是這個值的資料寬度。在64位的機器中,上述整數型別所用的儲存寬度通常是1位元組、2位元組、4位元組、4位元組、8位元組。

整數可以分為0、正數和負數,我們寫出乙個整數字面量時如10,這個整數字面量被認為是何種整數型別,也就是用多少二進位制位表示是由編譯器決定的。

字面量0,被編譯器認為是 int 型別,也就是說0被表示成4個位元組的二進位制串:0000 0000 0000 0000 0000 0000 0000 0000,注意這裡並沒有說它儲存在計算機中就是4個位元組,因為並不是將它賦值給int型別的變數。可以理解為,在儲存這個字面量之前,編譯器先將它翻譯成了4個位元組的0,至於真正如何儲存則要看用何種型別的變數接收這個字面量(字面量總是要賦值給乙個變數的,即總要儲存在計算機中,單純寫乙個字面量並不會被儲存)

雖然編譯器將字面量表示成的二進位制串並不一定和真正儲存時的一致,但這乙個中間步驟是很重要的,在這個中間二進位制形式到最終儲存的二進位制形式進行轉化時要同時參考這兩個型別,最終決定按何種規則轉換。

暫時將這兩個稱為識別型別和儲存型別。

編譯器很據不同的數值範圍將正整數字面量識別型別自動改變:

上述識別型別的資料寬度分別為4位元組、4位元組、8位元組、8位元組

windows系統下unsigned int 和unsigned long寬度一致,都是4個位元組,只不過寫十進位制形式和十六進製制(二進位制)形式時編譯器識別為這兩種型別。

上面的識別型別中,可以對正整數字面量新增u、l、ll、ul、ull字尾將其他型別轉化為另一種型別的字面量。但是只能將小寬度的轉化為大寬度型別,對大寬度字面量使用小寬度字尾是無效的,同樣沒有將unsigned型別轉化為signed型別(非usingned預設就是signed)。小寬度字面量使用大字尾的結果是擴充套件可資料寬度。如255ull、0xffull將int 字母量識別為unsigned long long。值得注意的是,signed和unsigned對字面量轉化為的二進位制串是沒有任何影響的,只有資料寬度的變化才影響二進位制串。所以對字面量加u字尾或者不加,沒有任何影響。但是對編譯器自動根據字面量值的範圍識別出來的識別型別,unsigned的字面量值在使用「-」取相反數時可能會出現邏輯上的錯誤,但本質上二進位制串與singned無差別。

正整數轉化為二進位制的方法是「除2取餘,逆向排列」,乙個正整數的字面量首先由編譯器自動確定識別型別即確定二進位制位數,然後按照此方法轉化為二進位制串,當轉換後二進位制位數不足識別型別的位數則在高位補0。

如12在0到2147483647之間,識別型別為int(4位元組32位)則相應的二進位制串為:

0000 0000 0000 0000 0000 0000 0000 1100表示為十六進製制為:0000000c

如果是十六進製制形式的正整數字面量,如0xff則識別為int型別,相應的二進位制串為0000 0000 0000 0000 0000 0000 1111 1111即十六進製制000000ff

並不存在真正的負數字面量,整數字面量只有0和正整數,在正整數前加乙個「-」單目運算子這並不意味著得到的是這個正整數字面量的相反數。c/c++中這一特點好像不合邏輯,但像之前所說,乙個正整數字面量最終只是轉化為乙個二進位制串但並不明確它是何值。我們完全可以按照自己的方式將記憶體中的乙個二進位制串解釋為整數、浮點數等等,顯然值是不同的。

那麼,對這樣乙個正整數字面量使用「-」運算子也不一定是此正整數的相反數。就像對乙個二進位制串使用「-」運算子,並不存在相反數的概念。實際上,對乙個正整數字面量使用「-」運算子只是將該字面量識別型別的二進位制串逐位取反再加1(溢位則捨棄高位,稱為二進位制反碼)。所以,乙個二進位制串做此操作後得到的新二進位制串在被指定解釋為整數時,這個反碼表示的不一定就是原整數字面量的相反數。例如,字面量255被認為是int型別,對應二進位制串0000 0000 0000 0000 0000 0000 1111 1111。而-255對應二進位制串1111 1111 1111 1111 1111 1111 0000 0001,如果仍解釋為int型別則其對應十進位制的-255,此時正是字面量的相反數。但是再如,字面量2147483648被識別為unsigned long,對應二進位制串0x80000000。而-2147483648對應的二進位制串為0x80000000和2147483648一樣(取反加1後一樣),所以無論將二者解釋成何種型別,因為對應的二進位制串一致所以應該總是同乙個值,而不是相反數。

由於「-」運算子這種對二進位制串的操作規則,使得對整數字面量使用後得到的並不一定是原字面量值的相反數。在整數字面量的識別型別中,帶有unsiged標誌的型別可能會出現這種情況(但不一定),所以有些編譯器如vs自帶編譯器會將這種對unsigned型別字面量使用「-」的操作視為錯誤,但非unsigned型別的字面量取「-」之後一定是原值的相反數。如果要關閉這一檢查,可以在vs中專案屬性中關閉sdl安全檢查。

實際上並不存在真正的負數字面量,「負數」表示成的二進位制串只是原正整數字面量二進位制串取補碼的操作結果。最安全的使用取相反數的解決方案是只對signed型別使用,最有效的檢查方法還是從二進位制串的變化來分析取相反數後是否和邏輯上的一致。

只需要記住一條規則:「-」運算子只是將原二進位制串取反加1,並非取相反數(不一定)。

上述所說只是整數字面量如何表示成二進位制串、整數字面量加"-"運算子後表示的二進位制串如何改變,並不一定是是該字面量最終的儲存形式也不一定整數字面量的值就是其整數的值,這些要結合它被賦值給何種型別的變數來說明。一串二進位制被解釋成何值、乙個整數字面量儲存成何種二進位制串是由儲存它的變數的型別決定的。

Go字面量(字面常量)

目錄 字面量字面量型別 整型字面量 浮點型字面量 複數型別字面量 字元型字面量 字串字面量 程式語言源程式中表示固定值的符號叫做字面量,也稱字面常量。一般使用裸字串行來表示不同型別的值。字面量可以被程式語言編譯器直接轉換為某個型別的值。go的字面量可以出現在兩個地方 一是用於常量和變數的初始化,二是...

資料表示字面量整型字面量

編寫程式,首先面對的是資料。在程式中,資料該如何表示出來?根據表示的方式不同,資料通常有兩種表示方式 直觀表示和指代表示。本章將詳細講解這兩種表示方式本文選自明明白白學c 大學霸。在 編寫中,資料往往是可以直接寫到 中的。對於這些資料,人們可以通過字面所表達的意思,獲知其含義,所以它們也被稱為字面量...

Scala函式字面量

scala中函式為頭等公民,你不僅可以定義乙個函式然後呼叫它,而且你可以寫乙個未命名的函式字面量,然後可以把它當成乙個值傳遞到其它函式或是賦值給其它變數。下面的例子為乙個簡單的函式字面量 參考整數字面量,3 為一整數字面量 x int x 1這是個函式字面量,它的功能為 1.符好 表示這個函式將符號...