在 C 語言中符號擴充套件 9 位
在本教程中,我們將學習如何在 C 語言中對 9 位整數進行符號擴充套件。首先,我們必須知道符號擴充套件到底是什麼。
什麼是符號擴充套件
符號擴充套件是指擴充套件一個數字,同時保持其符號位,例如,從 32 位變為 64 位。在當今使用的數字形式中,符號位始終是最高的。
這只是一個傳統問題,但據我們所知,情況總是如此。這表明我們需要將最關鍵數字的部分移動到新的最高位置,同時保持數字其他部分的完整性。
用 C 符號擴充套件 9 位整數
C 程式語言中的一些位運算子在硬體級別上執行。但是,要使用這些運算子,必須瞭解記憶體的架構以及 C 如何將資料儲存在記憶體中。
結構:
- 對於
char
型別的每個字元,記憶體被劃分為 1 個位元組。 int
型別的記憶體結構由 4 個位元組組成。short
型別的記憶體位置由 2 個位元組組成。
關於標誌的資訊可以在最左邊的部分找到。數字 1 表示負數,而數字 0 表示正數。
讓我們看一下以下示例,以更好地理解所討論的內容。
首先,在 main()
類中,我們將建立一個 short
型別的變數並將其命名為 val
。然後,我們將以與下面相同的方式分配變數。
short val = 234;
之後,我們將把我們製作的 short
值與一個 9 位數字一起提供給名為 res
的變數。
int res = val & 0b0000000111111111;
應用 if
檢查。這將檢查符號位,即你保持 (0x100)
的最高位是否已設定,如果是,則將其後的所有位置於其後。
if (val & 0x100) {
res = res | 0xFE00;
}
解釋:
我們建立了一個 val
變數,一個在記憶體中具有 16 位的小整數。然後使用&
運算子來遮蔽最近的 9 位。
它是按位運算中使用的 AND
運算子,其過程如下所述。
X Y res
0 0 0
0 1 0
1 0 0
1 1 1
-
res
代表結果,X
和Y
代表許多輸入選項。計算是一點一點進行的。如果具有相同有效值的兩個位都是 1,它只會產生 1。
-
因此,我們可以將值的最後 9 位按位
AND
運算子分開,其餘位將設定為 0。值0b0000000111111111
對應於二進位制表示。這表明只有最近的 9 位包含 1,而其餘的包含 0。
res
變數將使用結果更新。 -
之後,我們使用
if
檢查來驗證第一位。如果它是 1,我們將它新增到結果中。否則,我們將其保留為 0。
為此,我們再次使用按位 AND
運算子,這次我們只提取第一位,如果答案為 1,則使用|
運算子,它是按位 OR
運算子,工作方式如下。
X Y res
0 0 0
0 1 1
1 0 1
1 1 1
-
res
是輸出,X
和Y
是輸入可能性。是一點一點計算出來的。如果兩個相同的有效位都是 0,它只輸出 0。在
if
語句中,評估此運算子的結果。如果
true
,按位OR
運算子用於在結果的最左邊插入 1。 -
0xFE00
是二進位制數的十六進位制表示,如果存在符號位,則用於設定其上方的位。
通過利用 C 語言中的位運算子,我們可以執行各種其他操作。C 語言中的按位運算子比按位 AND
和按位 OR
多得多。
有按位 XOR
表示為^
符號。 ~
符號表示按位 NOT
運算子。
>>
符號表示左移運算子。你可以使用 <<
符號進行右移。
在這些操作員的幫助下,你可以通過多種方式完成這項工作或任何其他所需的工作。
完整的原始碼:
#include <stdio.h>
int main() {
short val = 234;
int res = val & 0b0000000111111111;
if (val & 0x100) {
res = res | 0xFE00;
}
return 0;
}
I have been working as a Flutter app developer for a year now. Firebase and SQLite have been crucial in the development of my android apps. I have experience with C#, Windows Form Based C#, C, Java, PHP on WampServer, and HTML/CSS on MYSQL, and I have authored articles on their theory and issue solving. I'm a senior in an undergraduate program for a bachelor's degree in Information Technology.
LinkedIn