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