簡體   English   中英

可以在 printf 中為 %c 賦予負的 int 參數嗎?

[英]Can %c be given a negative int argument in printf?

我可以在通過格式說明符%c打印時在printf中傳遞一個負整數,因為在打印int時會轉換為無符號字符? printf("%c", -65); 有效的? — 我在 GCC 上嘗試過,但得到了一個類似鑽石的字符(里面有問號),如 output。 為什么?

絕對是的,如果char是有符號類型。 C 允許char符號或無符號,在 GCC 中,您可以使用-funsigned-char-fsigned-char在它們之間切換。 當 char 被簽名時,它與 this 完全相同

char c = -65;
printf("%c", c);

當傳遞給printf()時, char變量將被符號擴展int ,因此printf()也會看到 -65,就像它是從常量傳遞的一樣。 printf根本無法區分printf("%c", c); printf("%c", -65); 由於可變參數函數中的默認提升

打印結果取決於字符編碼 例如,在ISO-8859-1Windows-1252字符集中,您會看到¿因為(unsigned char)-65 == 0xBF 在 UTF-8(這是一種可變長度編碼)中,0xBF 不允許作為起始 position 中的字符。 這就是為什么您會看到 � 它是無效字節的替換字符

請告訴我為什么代碼點 0 到 255 沒有映射到 unsigned char 中的 0 到 255。 我的意思是它們是非負數,所以我不應該只查看 UTF-8 字符集的相應值嗎?

映射不是由您認為的范圍內的相對 position 完成的,即代碼點 0 映射到CHAR_MIN ,代碼點 40 映射到CHAR_MIN + 40 ,代碼點 255 映射到CHAR_MAX ......在二進制補碼系統中,它通常是一個簡單的映射為無符號時基於位模式的值。 那是因為值通常從更廣泛的類型截斷的方式。 在 C 中,像'a'這樣的字符文字具有 int 類型。 假設'a'在某些理論字符集中映射到代碼點 130,那么下面的行是等價的

char c = 'a';
char c = 130;

無論哪種方式c在轉換為 char 后都將被分配一個值'a' ,即(char)'a' ,這可能是一個負值

因此,代碼點 0 到 255映射到 unsigned char 中的 0 到 255。 這意味着代碼點代碼點 0x1F 將存儲在值為 0x1F 的字符(有符號或無符號)中。 如果 char 是無符號的,代碼點 0xBF 將映射到 0xBF,如果 char 是有符號的,則映射到 -65

我假設以上所有內容都是 8 位字符。 另請注意,UTF-8 是 Unicode 字符集的編碼,它本身不是字符集,因此您無法查找 UTF-8 代碼點

暫無
暫無

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

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