簡體   English   中英

C語言如何將字符字面量轉換為數字,反之亦然

[英]How does C language transform char literal to number and vice versa

我最近一直在潛入 C/低級編程/系統設計。 作為一名經驗豐富的 Java 開發人員,我仍然記得我通過 SUN Java 認證的嘗試以及是否可以將 Java 中的char類型轉換為Integer以及如何實現的問題。 這就是我所知道和記住的 - 根據轉換,最多 255 的數字可以被視為數字或字符。

了解 CI 想了解更多,但我發現很難找到正確的答案(嘗試使用谷歌搜索,但我通常會得到 gazilion 結果如何在代碼中將 char 轉換為 int)它究竟是如何工作的,C 編譯器/系統調用轉換數字到字符,反之亦然。

AFAIK 中的內存號碼正在被存儲。 因此,讓我們假設在內存單元中我們存儲了值 65(即字母“A”)。 所以存儲了一個值,突然 C 代碼想要獲取它並存儲到char變量中。 到現在為止還挺好。 然后我們為給定的char參數發出帶有%c格式的printf過程。

這就是魔法發生的地方 - printf知道值為 65 的字符是字母 'A' (並且應該將其顯示為字母)。 它是原始 ASCII 范圍的基本符號(不是一些有趣的表情符號風格的 UTF 符號)。 它是否調用外部 STD/庫/系統調用來咨詢編碼系統? 我希望得到一些詳細的、低級的解釋或至少鏈接到可信賴的來源。

C 語言在很大程度上不知道字符的實際編碼。 它有一個源字符集,用於定義編譯器如何處理源代碼中的字符。 因此,例如在舊的 IBM 系統上,源字符集可能是 EBCDIC,其中 65 不代表“A”。

C 還有一個執行字符集,它定義了正在運行的程序中字符的含義。 這似乎與您的問題更相關。 但它並沒有真正影響像printf這樣的 I/O 函數的行為。 相反,它會影響ctype.h函數(如isalphatoupper printf只是將它視為一個char大小的值,由於使用默認參數提升的可變參數函數,它作為int接收(任何小於int類型都被提升為int ,而float被提升為double )。 printf然后將相同的值移到stdout文件中,然后這是其他人的問題。

如果源字符集和執行字符集不同,那么編譯器將執行適當的轉換,這樣源標記'A'將在運行程序中作為執行字符集中對應的A進行操作。 兩個字符集的實際編碼選擇,即。 無論是 ASCII 還是 EBCDIC 或其他什么都是實現定義的。

對於控制台應用程序,接收字符值的控制台或終端必須在字體的字形表中查找它以顯示正確的字符圖像。

字符常量是int類型。 除了char是有符號還是無符號由實現定義這一事實外, char大多可以被視為窄整數。 兩者之間唯一需要的轉換是縮小或擴大(以及可能的符號擴展)。

printf知道值為 65 的字符是字母 'A'(並且應該將其顯示為字母)是多么准確。”

它通常不會,甚至不需要。 甚至編譯器看不到C 語言片段中的字符' , A'

char a = 'A';
printf("%c", c);

如果源字符集和執行字符集都是 ASCII 或 ASCII 兼容的,就像現在的情況一樣,編譯器將在字節流中包含三元組 39, 65, 39 - 或者更確切地說00100111 01000001 00100111 並且它的解析器的編程規則是兩個00100111之間的東西是字符文字,並且由於01000001不是魔法值,所以它被翻譯成最終程序。

然后,C 程序在運行時一直處理01000001 (盡管有時它可能將01000001零擴展int ,例如00000000 00000000 00000000 01000001在 32 位系統上不會改變其前導數值; )。 在某些系統上, printf -或者說潛在的內部文件例程-可能轉化字符值01000001別的東西。 但在大多數系統上, 01000001將按01000001傳遞給操作系統。 然后在操作系統上 - 或者可能在從操作系統接收輸出的 GUI 程序中 - 將想要顯示該字符,然后查詢與01000001對應的字形的顯示字體,通常字母01000001字形看起來就像是

一種

這將顯示給用戶。

系統在任何時候都不會真正使用字形字符操作,而只是使用二進制數。 系統本身就是一個中文房間


printf的真正printf不在於它如何處理字符,而在於它如何處理數字,因為這些數字被轉換為更多字符 雖然%c傳遞值原樣, %d這樣一個簡單的整數值轉換為0b101111000110000101001110以流的字節0b00110001 0b00110010 0b00110011 0b00110100 0b00110101 0b00110110 0b00110111 0b00111000使得顯示例程將正確地顯示其作為

12345678

C 中的char只是一個整數 CHAR_BIT 位長。 通常它是 8 位長。

printf 如何確切知道值為 65 的字符是字母“A”

實現知道它使用什么字符編碼,並且 pritnf 函數代碼采取適當的行動輸出字母'A'

暫無
暫無

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

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