C 语言中无符号整数和有符号整数的区别
下面的文章将探讨 C 编程语言中带符号和无符号 int 之间的区别。
C 语言中 signed 和 unsigined Int 之间的区别
signed int 和 unsigned int 之间的区别并不像某些人想象的那么复杂。signed int 通常表示为 int,但在处理 unsigned int 时,我们必须写为 unsigned int。
int 是一种数据类型而 unsigned 只是一个关键字这一事实具有与硬件级别相关的特定功能。这种独特的目的在两者之间产生了更显着的差异,将在以下部分中进一步详细介绍。
int数据类型是signed并且必须具有至少-32767到32767的范围作为其最小范围要求。limits.h指的是实际值作为INT MIN和INT MAX的对应值。unsigned int具有从0到65535(含)的最小范围,实际最大值由头文件的UINT_MAX常量定义。如果值为无符号,则不需要将位之一用于符号。
这意味着你会收到更多种类的正面编码,而不会牺牲任何负面编码。
内存要求
首先,检查 signed int 和 unsigned int 在计算机系统中占用了多少内存空间。
-
int的内存要求是4 bytes,乘以8是32 bits。4x8 = 32 bits -
此外,
unsigned int还占用了4 字节的内存空间,加起来为32 位。- 在
int数据类型中,32-bits中最左边的bit指定为sign bit,指示整数是正数还是负数。1表示负值,而0表示正值。 - 当前可以存储在
int变量中的整数范围是-(2^31)到2^31-1,等于-2 147 483 648到2 147 483 647)。
- 在
当一个负数输入计算机时,它会以二进制形式表示为该数字的二进制补码。正因为如此,内存的开始位总是被设置为 1,而计算机只要看到初始位被设置为 1,就会知道它遇到了一个负数。
每当我们访问该数字时,它都会通过对其应用二进制补码来恢复其原始形式。然而,对于 unsigned int 数据类型,没有像 sign bit 这样的 bit。
因此,它现在拥有所有 32 位可供我们用来存储数据。unsigned int 中可以存储的整数范围是从 0 到 2^32-1,相当于 0 到 4、294、967、295,包括的。
unsigned int 数据类型的变量是计算机通常以二进制格式存储数据的地方。
让我们举个例子。首先,我们将给变量 x 一个无符号类型的初始值。
然后,当我们试图将负数保存在 unsigned int 变量 x 中时,计算机使用 123 的二进制补码将其表示为负数。然后将该表示存储在 x 变量的内存中。
unsigned int x;
x = -123;
因此,当我们将负数 -123 保存在 int 数据类型的变量 y 中时,计算机将 -123 的二进制补码表示为负整数,然后将其存储在 y 变量的记忆。
int y;
y = -123;
Unsigned int 变量仅以标准二进制形式保存正值;当我们试图通过 x 变量的内存访问它的内存时,没有保留符号位。结果,计算机不需要转换,之前保存的二进制补码被恢复并显示为常规二进制数。
printf("%d\n", x);
当我们试图访问变量 y 的内存时,计算机确定它是 int 数据类型。然后它检查了 32-bit 最左边位置的 bit,发现它是 1。
结果,它再次使用了二进制补码,添加了一个负号(-),并打印了结果。
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 数据类型会有所帮助。
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