在 C 语言中符号扩展 9 位

Muhammad Zeeshan 2023年10月12日
  1. 什么是符号扩展
  2. 用 C 符号扩展 9 位整数
在 C 语言中符号扩展 9 位

在本教程中,我们将学习如何在 C 语言中对 9 位整数进行符号扩展。首先,我们必须知道符号扩展到底是什么。

什么是符号扩展

符号扩展是指扩展一个数字,同时保持其符号位,例如,从 32 位变为 64 位。在当今使用的数字形式中,符号位始终是最高的。

这只是一个传统问题,但据我们所知,情况总是如此。这表明我们需要将最关键数字的部分移动到新的最高位置,同时保持数字其他部分的完整性。

用 C 符号扩展 9 位整数

C 编程语言中的一些位运算符在硬件级别上运行。但是,要使用这些运算符,必​​须了解内存的架构以及 C 如何将数据保存在内存中。

结构:

  1. 对于 char 类型的每个字符,内存被划分为 1 个字节。
  2. int 类型的内存结构由 4 个字节组成。
  3. 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
  1. res 代表结果,XY 代表许多输入选项。计算是一点一点进行的。

    如果具有相同有效值的两个位都是 1,它只会产生 1。

  2. 因此,我们可以将值的最后 9 位按位 AND 运算符分开,其余位将设置为 0。值 0b0000000111111111 对应于二进制表示。

    这表明只有最近的 9 位包含 1,而其余的包含 0。res 变量将使用结果更新。

  3. 之后,我们使用 if 检查来验证第一位。如果它是 1,我们将它添加到结果中。否则,我们将其保留为 0。

为此,我们再次使用按位 AND 运算符,这次我们只提取第一位,如果答案为 1,则使用|运算符,它是按位 OR 运算符,工作方式如下。

X   Y   res
0   0   0
0   1   1
1   0   1
1   1   1
  1. res 是输出,XY 是输入可能性。是一点一点计算出来的。

    如果两个相同的有效位都是 0,它只输出 0。在 if 语句中,评估此运算符的结果。

    如果 true,按位 OR 运算符用于在结果的最左边插入 1。

  2. 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;
}
Muhammad Zeeshan avatar Muhammad Zeeshan avatar

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