[英]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-1或Windows-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.