短有符号整数和有符号整数有什么区别?

3

我在参考一份有关C语言的教程时发现,signed int和short signed int的范围都是-32768到32767,它们都占用2个字节。这两种声明方式有什么区别吗?如果没有,为什么要使用两种不同的声明方式呢?


1
你是从哪个教程学到这个的? - Praveen S
2
这是一个非常糟糕的教程。它不仅教授特定于实现的无意义内容,而且还是15年前过时的特定于实现的无意义内容。 - R.. GitHub STOP HELPING ICE
那是“短”范围过时的 :). - Praveen S
1
好的,稍微修改一下将-32767作为负限制,这些就是 C 标准的最小范围,对于编写真正可移植的代码非常重要。 - caf
8个回答

9

这是平台特定的 - 在这种情况下,你唯一可以确定的是sizeof(int) >= sizeof(short) >= 16 bits


它是特定于平台的。但是,根据标准,符合规范的实现应强制执行较低限制。(另请参见下面的答案)。 - Vijay Mathew
@Vijay:如果你仔细重新阅读我上面写的内容,你应该会发现它涵盖了这些下限。 - Paul R
1
不,就C语言而言,你永远无法确定sizeof(short)>=2char可能是32位甚至64位,然后所有类型的大小都将为1(除了long long)。但是,您确实保证char至少为8位,shortint至少为16位,long至少为32位,long long至少为64位。自然的<=关系也适用于连续的“较大”类型之间。 - R.. GitHub STOP HELPING ICE
@R..:说得好 - 我在写“2”时暗示了“2个8位字节”,但我应该更加小心 - 我会编辑答案来修复这个问题。 - Paul R

8
您的问题最佳答案可以在C的ANSI标准中找到,第2.2.4.2节 - 数值极限。以下是该部分相关内容的摘录:
“数值极限” 符合规范的实现应记录此部分中指定的所有限制,这些限制应在头文件和中指定。
“整数类型的大小” 下面给出的值应被适当的常量表达式所取代,以便在#if预处理指令中使用。它们的实现定义值应等于或大于(绝对值)所示值,并具有相同的符号。
最小对象的最大位数(不是位域)(字节)CHAR_BIT 8 signed char类型的最小值SCHAR_MIN -127 signed char类型的最大值SCHAR_MAX +127 unsigned char类型的最大值UCHAR_MAX 255 char类型的最小值CHAR_MIN见下文 char类型的最大值CHAR_MAX见下文 任何支持的区域设置中多字节字符的最大字节数MB_LEN_MAX 1 short int类型的最小值SHRT_MIN -32767 short int类型的最大值SHRT_MAX +32767 unsigned short int类型的最大值USHRT_MAX 65535 int类型的最小值INT_MIN -32767 int类型的最大值INT_MAX +32767 unsigned int类型的最大值UINT_MAX 65535 long int类型的最小值LONG_MIN -2147483647 long int类型的最大值LONG_MAX +2147483647 unsigned long int类型的最大值ULONG_MAX 4294967295
不太常见的C99添加了以下数字类型:
  • long long int 类型变量的最小值 LLONG_MIN -9223372036854775807 // -(263 - 1)
  • long long int 类型变量的最大值 LLONG_MAX +9223372036854775807 // 263 - 1
  • unsigned long long int 类型变量的最大值 ULLONG_MAX 18446744073709551615 // 264 - 1

3
几篇回答已经正确引用了C标准,该标准对类型规定了最小范围。然而,你会发现,short intint的最小范围是相同的,因此问题在于:为什么short intint是不同的?何时应该选择其中之一?
提供int类型的原因是为了提供一种类型,旨在匹配所涉及硬件上“最高效”的整数类型(仍满足最小要求范围)。在C中,int应该作为通用小整数类型使用,它应该是你的默认选择。
如果你知道需要的范围超过-32767到32767,那么你应该选择long intlong long int。如果你要存储大量的小整数,空间效率比计算效率更重要,那么你可以选择short(甚至是signed char,如果你知道你的值将适合-127到127的范围)。

2
C和C ++只对其对象保证最小尺寸,没有精确的大小保证。您不能指望类型short恰好为2个字节,只能保证它可以容纳指定范围内的值(因此至少为两个字节)。类型int至少与short一样大,并且通常更大。请注意,signed int是说int的冗长方式,而signed short int是说short int的冗长方式,后者是说short的冗长方式。除了类型char(某些编译器将其设为无符号),所有内置整数类型默认都为有符号。类型short intlong int是说shortlong的较长方式,分别。

1

signed int 至少和 short signed int 一样大。在现代大多数硬件上,short int 是2个字节(正如您所看到的),而常规的 int 是4个字节。旧的架构通常有一个2字节的 int,这可能是您困惑的原因。

还有一个 long int,它通常是4或8个字节,具体取决于编译器。


那么在旧的架构中,signed int和short signed int是相同的吗? - jerry

1
请先阅读有关有符号字符的解释,然后我们再谈论有符号/无符号整数。
首先,我想为您的问题做一些背景准备。
................................................
char数据类型有两种类型:
无符号字符;
有符号字符;
(即整数数据类型)

.................................................

根据不同的书籍解释如下:
char 1字节 -128到127(即默认为有符号char)

signed char 1字节 -128到127

unsigned char 1字节 0到255

.................................................

还有一件事,1字节=8位(从第0位到第7位)。

由于处理器标志寄存器保留第7位表示符号(即1=正数,0=负数)


-37将被表示为1101 1011(最高有效位为1),

+37将被表示为0010 0101(最高有效位为0)。


.................................................

同样地,对于char,最后一位默认被视为有符号。


为什么呢?

因为char也取决于特定字符的ASCII代码(例如A=65)。


无论如何,我们都只使用char并且只使用7位。

在这种情况下,为了将char / int的内存范围增加1个位,我们使用无符号的char或无符号的int;

感谢您的问题。

类似地,对于4位int或2位int,我们需要有符号的int和无符号的int。


0
我在参考一份关于C语言的教程,发现有符号整型和短有符号整型的范围是-32768到32767,且它们占用2个字节。

那是一份非常老的教程。现代C标准如Paul R所说。在32位架构上,通常:

    short int is 16 bits
          int is 32 bits
     long int is 32 bits
long long int is 64 bits

在16位机器上,整数的大小通常只有16位。如今,16位机器可能仅限于嵌入式设备。

在16位机器上,变量的大小可能是这样的:

    short int is 16 bits
          int is 16 bits
     long int is 32 bits
long long int is 64 bits

0

这取决于平台。

在32位系统上,int为32位宽度,在64位系统上为64位宽度(我确定这总是如此)。


x86-64通常在64位硬件上是32位整数,IA64是64位整数,有几种不同的模型: http://www.unix.org/version2/whatsnew/lp64_wp.html - Steve-o
这取决于C语言的实现。在“LP64”实现中,int是32位,long int是64位,指针是64位。在ILP64实现中,int也是64位。 - JeremyP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接