[英]C: char to int conversion
從C編程語言(Brian W. Kernighan),2.7 TYPE CONVERSIONS,第43頁:
“關於將字符轉換為整數,有一個微妙的觀點....在某些宏上,最左邊的位為1的字符將轉換為負整數。在其他宏上,...始終為正。為了便於攜帶,請指定signed如果要將非字符數據存儲在char變量中,則為unsigned。“
我的問題是:
為什么有人想在char中存儲非char數據? (這是必要的例子真的很棒)
為什么char的整數值在轉換為int時會發生變化?
你能詳細說明這個可移植性問題嗎?
1) char
是C中單個字節的大小,因此用於存儲任何類型的數據。 例如,將圖像加載到內存中時,數據表示為char
數組。 在現代代碼中,諸如uint8_t
類的typedef用於指示緩沖區的用途,而不僅僅是char
。
2&3) char
是有符號還是無符號是依賴於平台的,因此如果程序依賴於此行為,則最好明確指定一個或另一個。
關於1)
當人們真正想要數據流的字節緩沖區時,人們經常使用char數組。 這不是很好的做法,但很多項目都是這樣做的,如果你小心,就沒有真正的傷害。 可能還有其他時間。
關於2)
當從較小的數據類型移動時,有符號整數通常是符號擴展的。 因此,當擴展到32位時,11111111b(基數10中的-1)變為11111111 11111111 11111111 11111111。 但是,如果char打算是無符號+255,則有符號整數可能最終為-1。
關於便攜性3)
有些機器將字符視為有符號整數,而有些則將其解釋為無符號。 它也可能因編譯器實現而異。 大多數時候你不必擔心它。 Kernighan只是想幫助您了解細節。
我知道這是一個死的問題,但您可以使用以下代碼檢查系統上的字符是否已簽名或未簽名:
#include <limits.h> //Include implementation specific constants (MAX_INT, et c.)
#if CHAR_MAX == SCHAR_MAX
// Plain "char" is signed
#else
// Plain "char" is unsigned
#endif
char
類型定義為保存一個字節,即sizeof(char)
定義為1
。 例如,這對於序列化數據很有用。
char
是實現定義為unsigned char
或signed char
。 現在假設char
意味着smallint
。 當你從smallint
轉到int
時,你只是將一個小整數轉換為一個更大的整數。 問題是,您不知道smallint
是簽名還是未簽名。
我會說,只要你遵循聖經(K&R),它就不是真正的便攜性問題。
unsigned char
通常用於一次處理一個字節的二進制數據。 一個常見的例子是UTF-8字符串,它們並非嚴格地由“字符”組成。
如果有符號字符是8位且頂部位設置,則表示它是負數。 當轉換為更大的類型時,通過將高位擴展到新類型的高位來保持符號。 這稱為“符號擴展”賦值。
1)Char在所有系統中實現為一個字節,因此它是一致的。
2)你在問題中提到的位是用於單字節整數的那個用於它們的燒寫的位。 當一個系統上的int大於一個字節時,當你將char轉換為int時,符號平面不受影響,否則它就是。 (還有燒焦和未簽名的字符)
3)由於char實現的一致性,許多lib使用它們像Intel IPP(Intel Performance Primitives)庫和它們的堂兄OpenCV。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.