簡體   English   中英

C 中的字符和整數運算

[英]Operations with Characters and Integers in C

我是編程語言的新手,我需要你的幫助。 我在這里研究某人的代碼,我可以使用這些表達式,我的疑問是這里的操作是如何完成的,因為字符和整數是兩種不同的數據類型? integer 類型將如何保存字符值?

謝謝

int line, col;
char ch;
scanf("%d%c", &line, &ch);
//line--;
col = ch - 'A';

在基本層面上,C 中的每種類型(無論是 char、int、uint32_t、short、long ......)都由字節表示,並且在形式上是“數字”。 您可以將它們彼此相減/以您喜歡的任何組合相加 - 只要將結果值存儲在一個足夠大的類型的變量中以容納它 - 否則會導致緩沖區溢出。

在您的示例中,由於 char 類型由單個字節表示,而 int 由 8 組成,因此此減法的結果將簡單地存儲在 int 的最右邊字節中(但是,取決於您是否處理將產生負值的表達式,那么 memory 中的 int 表示會略有不同 - 如果您有興趣,請查看 2 的補碼)。

當你將兩個字符相減並放入一個integer類型的變量中時,實際上是兩個字符的ASCII碼相減。 例如當你有: int col = 'D' - 'A' col 的值等於 3 因為 D 的 ascii 碼等於 68 而 A 的 ascii 碼是 65. 所以 col 是 3,但是 D & A是性格。

我的疑問是這里的操作是如何完成的,因為字符和整數是兩種不同的數據類型?

我不確定這個問題在這里的接受程度如何,因為它是關於語言的一些相當基本的行為,但我建議你考慮類型和類型匹配 繼續這樣做!

首先要了解的是,在 C 中, char及其有符號和無符號變體屬於 integer 數據類型,因此不存在類型類別不匹配,只是可能不同的范圍和符號的問題。 字符由 integer 代碼表示(事實上,幾乎是計算機內存中的所有內容)。

第二件要了解的是 C 支持對混合類型的操作數進行各種算術運算。 它定義了一組“常用算術轉換”,用於選擇操作數的通用類型和每個算術運算的結果。 操作數會自動轉換為該類型。 我不會在這里介紹所有細節,但基本上,浮點類型勝過 integer 類型,更寬的類型勝過更窄的類型。

要理解的第三件事是 C 在任何情況下都不會直接定義 integer 類型的算術比(從技術上講,具有int轉換的排名小於)。 當一個較窄的值出現在算術表達式中時,它會自動轉換為int (如果int可以表示原始類型的所有值)或unsigned int 這些自動轉換稱為“ integer 提升”,它們是通常算術轉換的子集。

有時需要知道的第四件事是,在 C 中,“ integer 字符常量”例如'A'具有int類型,而不是char類型(C++ 在此處有所不同)。

所以,要評價這個...

 col = ch - 'A';

...通常的算術轉換首先應用於ch'A' 這涉及對ch的值執行 integer 提升,產生相同的數值,但作為int 常量'A'已經具有int類型,因此它們現在匹配,並且無需任何進一步的轉換即可計算它們的差異。 結果是int ,它與col類型相同,因此也不需要轉換來分配結果。

integer 類型將如何保存字符值?

字符值為integer 值。 int類型可以容納char類型可以容納的所有值。 *在這方面沒有什么特別的事情發生。


*從技術上講, int可以容納所有可以用signed char表示的值, unsigned int可以容納所有可以用unsigned char類型表示的值,並且兩者中至少有一個可以容納所有可以用 char 表示的值(默認) char 您不太可能遇到 C 實現,其中存在int無法容納的char值,並且上面假設您沒有使用這樣的實現,但這些是允許的並且有些可能存在。

暫無
暫無

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

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