C 中的 short int(或 short)和 int 有何不同?它们具有相同的大小和范围。如果它们本质上是相同的,那么拥有两种数据类型有什么用?
10 回答
它们可能具有相同的大小,但可以保证int
等于或大于short int
。
理论上/按照 C 标准,它们可以是任何大小,只要16 bit <= short <= int
.
在现实世界中,这就是尺寸的实现方式。
CPU short int
8 bit 16 16
16 bit 16 16
32 bit 16 32
64 bit 16 32
永远不要依赖 C 中给定大小的数据类型。如果有疑问,请始终检查 limits.h 中的边界。
我们现在可以肯定的是:
2 <= sizeof(short) <= sizeof(int)
5.2.4.2.1 整数类型<limits.h>
的大小给出了最小大小:
1 [...] 它们的实现定义值的大小(绝对值)应等于或大于所示的 [...]
- UCHAR_MAX 255 // 2 8 - 1
- USHRT_MAX 65535 // 2 16 - 1
- UINT_MAX 65535 // 2 16 - 1
- ULONG_MAX 4294967295 // 2 32 - 1
- ULLONG_MAX 18446744073709551615 // 2 64 - 1
6.2.5 类型然后说:
8 对于任何两个具有相同符号和不同整数转换等级的整数类型(见 6.3.1.1),具有较小整数转换等级的类型的值范围是另一个类型的值的子范围。
和6.3.1.1 布尔值、字符和整数确定相对转换等级:
1 每个整数类型都有一个整数转换等级,定义如下:
- long long int 的rank 大于long int 的rank,long int 的rank 大于int 的rank,short int 的rank 大于signed char 的rank。
- 任何无符号整数类型的等级应等于相应的有符号整数类型的等级,如果有的话。
- 对于所有整数类型 T1、T2 和 T3,如果 T1 的秩大于 T2 且 T2 的秩大于 T3,则 T1 的秩大于 T3
这取决于系统。某些操作系统的两种类型的长度不同。
实际上一切都取决于编译器和系统。但基本规则是 int 永远不能小于 short,也永远不能大于 long。
短 <= 整数 <= 长
我今天也在做同样的事情。我的结论是它取决于执行程序的机器架构的字长。根据 C99 limits.h 文档。
/* Minimum and maximum values a `signed short int' can hold. */
# define SHRT_MIN (-32768)
# define SHRT_MAX 32767
/* Maximum value an `unsigned short int' can hold. (Minimum is 0.) */
# define USHRT_MAX 65535
/* Minimum and maximum values a `signed int' can hold. */
# define INT_MIN (-INT_MAX - 1)
# define INT_MAX 2147483647
/* Maximum value an `unsigned int' can hold. (Minimum is 0.) */
# define UINT_MAX 4294967295U
/* Minimum and maximum values a `signed long int' can hold. */
# if __WORDSIZE == 64
# define LONG_MAX 9223372036854775807L
# else
# define LONG_MAX 2147483647L
# endif
# define LONG_MIN (-LONG_MAX - 1L)
/* Maximum value an `unsigned long int' can hold. (Minimum is 0.) */
# if __WORDSIZE == 64
# define ULONG_MAX 18446744073709551615UL
# else
# define ULONG_MAX 4294967295UL
# endif
让我知道是否有人有更好的答案。
“一种编程语言中的短整数可能在不同的语言或不同的处理器上具有不同的大小。在某些语言中,这个大小是跨平台固定的,而在其他语言中,它取决于机器。在某些语言中,这种数据类型不存在完全没有。”
short 和 int 必须至少为 16 位,long 必须至少为 32 位,并且该 short 不长于 int,即不长于 long。通常,short 是 16 位,long 是 32 位,int 是 16 位或 32 位。
这取决于编译器。在某些编译器中,int 是 2 个字节,而在其他编译器中是 4 个字节。