簡體   English   中英

C:char轉換為int

[英]C: char to int conversion

從C編程語言(Brian W. Kernighan),2.7 TYPE CONVERSIONS,第43頁:

“關於將字符轉換為整數,有一個微妙的觀點....在某些宏上,最左邊的位為1的字符將轉換為負整數。在其他宏上,...始終為正。為了便於攜帶,請指定signed如果要將非字符數據存儲在char變量中,則為unsigned。“

我的問題是:

  1. 為什么有人想在char中存儲非char數據? (這是必要的例子真的很棒)

  2. 為什么char的整數值在轉換為int時會發生變化?

  3. 你能詳細說明這個可移植性問題嗎?

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
  1. char類型定義為保存一個字節,即sizeof(char)定義為1 例如,這對於序列化數據很有用。

  2. char是實現定義為unsigned charsigned char 現在假設char意味着smallint 當你從smallint轉到int時,你只是將一個小整數轉換為一個更大的整數。 問題是,您不知道smallint是簽名還是未簽名。

  3. 我會說,只要你遵循聖經(K&R),它就不是真正的便攜性問題。

unsigned char通常用於一次處理一個字節的二進制數據。 一個常見的例子是UTF-8字符串,它們並非嚴格地由“字符”組成。

如果有符號字符是8位且頂部位設置,則表示它是負數。 當轉換為更大的類型時,通過將高位擴展到新類型的高位來保持符號。 這稱為“符號擴展”賦值。

1)Char在所有系統中實現為一個字節,因此它是一致的。

2)你在問題中提到的位是用於單字節整數的那個用於它們的燒寫的位。 當一個系統上的int大於一個字節時,當你將char轉換為int時,符號平面不受影響,否則它就是。 (還有燒焦和未簽名的字符)

3)由於char實現的一致性,許多lib使用它們像Intel IPP(Intel Performance Primitives)庫和它們的堂兄OpenCV。

通常,在C中,char到int轉換反之亦然是一個問題,因為用於讀取字符輸入/寫入字符輸出的stanard API使用int's作為字符參數和返回值。 例如,請參閱getchar()getc()putchar()

此外,由於char的大小是1個字節,因此將任意數據作為字節流處理是一種方便的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM