在 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