C 语言中无符号整数和有符号整数的区别

C 语言中无符号整数和有符号整数的区别

Muhammad Zeeshan Jul-18, 2022 C C Int
  1. C 语言中 signedunsigined Int 之间的区别
  2. 内存要求
  3. 结论

下面的文章将探讨 C 编程语言中带符号和无符号 int 之间的区别。

C 语言中 signedunsigined Int 之间的区别

signed intunsigned int 之间的区别并不像某些人想象的那么复杂。signed int 通常表示为 int,但在处理 unsigned int 时,我们必须写为 unsigned int

int 是一种数据类型而 unsigned 只是一个关键字这一事实具有与硬件级别相关的特定功能。这种独特的目的在两者之间产生了更显着的差异,将在以下部分中进一步详细介绍。

  • int 数据类型是 signed 并且必须具有至少 -3276732767 的范围作为其最小范围要求。limits.h 指的是实际值作为 INT MININT MAX 的对应值。
  • unsigned int 具有从 065535(含)的最小范围,实际最大值由头文件的 UINT_MAX 常量定义。如果值为无符号,则不需要将之一用于符号

这意味着你会收到更多种类的正面编码,而不会牺牲任何负面编码。

内存要求

首先,检查 signed intunsigned int 在计算机系统中占用了多少内存空间。

  1. int 的内存要求是 4 bytes,乘以 832 bits

    4x8= 32 bits
    
  2. 此外,unsigned int 还占用了 4 字节 的内存空间,加起来为 32 位

    • int 数据类型中,32-bits 中最左边的 bit 指定为 sign bit,指示整数是正数还是负数。1 表示负值,而 0 表示正值。
    • 当前可以存储在 int 变量中的整数范围是 -(2^31)2^31-1,等于 -2 147 483 6482 147 483 647)。

当一个负数输入计算机时,它会以二进制形式表示为该数字的 2 补码。正因为如此,内存的开始总是被设置为 1,而计算机只要看到初始被设置为 1,就会知道它遇到了一个负数。

每当我们访问该数字时,它都会通过对其应用 2 的补码来恢复其原始形式。然而,对于 unsigned int 数据类型,没有像 sign bit 这样的 bit

因此,它现在拥有所有 32 位可供我们用来存储数据。unsigned int 中可以存储的整数范围是从 02^32-1,相当于 04294967295,包括的。

unsigned int 数据类型的变量是计算机通常以二进制格式存储数据的地方。

让我们举个例子。首先,我们将给变量 x 一个无符号类型的初始值。

然后,当我们试图将负数保存在 unsigned int 变量 x 中时,计算机使用 1232's 补码将其表示为负数。然后将该表示存储在x` 变量的内存中。

unsigned int x;
x = -123;

因此,当我们将负数 -123 保存在 int 数据类型的变量 y 中时,计算机将 -1232 的补码表示为负整数,然后将其存储在 y 变量的记忆。

int y;
y = -123;

Unsigned int 变量仅以标准二进制形式保存正值;当我们试图通过 x 变量的内存访问它的内存时,没有保留符号位。结果,计算机不需要转换,之前保存的 2 补码被恢复并显示为常规二进制数。

printf("%d\n",x);

当我们试图访问变量 y 的内存时,计算机确定它是 int 数据类型。然后它检查了 32-bit 最左边位置的 bit,发现它是 1

结果,它再次使用了 2 的补码,添加了一个负号(-),并打印了结果。

printf("%d\n",y);

完整的源代码:

#include <stdio.h>

int main() {
  unsigned int x;
  x = -123;
  int y;
  y = -123;
  printf("%d\n",x);
  printf("%d\n",y);
  return 0;
}

输出:

-123
-123

结论

现在我们熟悉了有符号整数和无符号整数之间的主要区别,你还应该意识到这两种数据形式都有一些优点和缺点,其平衡完全取决于你的需求。

例如,如果你希望存储大量数字,你应该使用 unsigned int,并且你确信永远不会有负值。否则,如果你使用 int 数据类型会有所帮助。

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

相关文章 - C Int

  • 在 C 语言中转换 Char*为 Int
  • 如何在 C 语言中把整数转换为字符
  • 如何在 C 语言中把整数转换成字符串