C中的“short int”和“int”有啥区别?
Posted
技术标签:
【中文标题】C中的“short int”和“int”有啥区别?【英文标题】:What is the difference between "short int" and "int" in C?C中的“short int”和“int”有什么区别? 【发布时间】:2012-08-30 00:46:54 【问题描述】:C 中的 short int(或 short)和 int 有何不同?它们具有相同的大小和范围。如果它们本质上相同,那么拥有两种数据类型有什么用?
【问题讨论】:
在 16 位编译器中,它们具有相同的大小和范围。几乎所有主流平台的现代编译器都有sizeof(int) > sizeof(short)
。
【参考方案1】:
它们可能具有相同的大小,但保证int
等于或大于short int
。
【讨论】:
真正保证的是short int
的范围至少是-32767 .. +32767,short int
的范围是范围的子集int
。由此可知short int
和int
都至少是16 位。由于填充位,理论上可以有sizeof (short int) > sizeof (int)
,但可能性很小。
@KeithThompson 你能详细说明sizeof (short int) > sizeof (int)
吗?
@icepack:整数类型可以有填充位,这些位对值没有贡献。例如,符合要求的实现理论上可以有 32 位(其中 16 个填充位)的 short
和 24 位(全部有效)的int
。我想不出有什么理由去做这种傻事,但标准并没有禁止。【参考方案2】:
"一种编程语言中的短整数可能有不同的大小 使用不同的语言或在不同的处理器上。在某些语言中 这个大小在平台上是固定的,而在其他平台上是 机器相关。在某些语言中,此数据类型不存在于 全部。”
Source
【讨论】:
但问题是关于 C. 是的,发布的源链接显示了 C、C++、C# 和 Java 的区别。 您引用的部分没有回答问题。 (顺便说一句,该段后来从文章中删除。)【参考方案3】:这取决于系统。某些操作系统的两种类型的长度不同。
【讨论】:
【参考方案4】:永远不要依赖 C 中给定大小的数据类型。如有疑问,请始终检查 limits.h 中的边界。
【讨论】:
当然,如果您使用的是uint32_t
和来自<stdint.h>
的朋友。
这是 C99 标准的一部分,它让我们回到其他人提出的关于使用什么操作系统/编译器的问题。【参考方案5】:
实际上一切都取决于编译器和系统。但基本规则是 int 永远不能小于 short,也永远不能大于 long。
短
【讨论】:
char ISO C90 不支持 long long【参考方案6】:理论上/按照 C 标准,它们可以是任意大小,只要 16 bit <= short <= int
。
在现实世界中,这就是尺寸的实现方式。
CPU short int
8 bit 16 16
16 bit 16 16
32 bit 16 32
64 bit 16 32
【讨论】:
你有没有在 64 位的 linux 中的 ansi c 和 64 位的 windows 中的 Visual Studio 中检查它我只是想知道.. @BharatSharma 64 位仅对long
和long long
的大小有影响。显然,一些 64 位系统将 long 定义为 64 位,而其他系统实现 C99/C11 标准并将long long
用于 64 位,而将long
保留为 32 位。
谢谢,一旦我发现与 long 相关的问题,所以我想这也可能是 short... :)
它们不能是任何尺寸;两者都必须至少为 16 位。顺便说一句,我曾在 32 位 (Cray T3E) 和 64 位 (Cray T90) short
的系统上工作过。
@Lundin 那么在 64 位拱门中,int
与 long
相同(都是 32 位),这是真的吗?【参考方案7】:
C99 N1256 standard draft
我们现在可以肯定的是:
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 的秩应大于 long int 的秩,即 应该大于int的rank,int的rank应该大于short的rank int,应大于signed char的等级。 任何无符号整数类型的等级应等于相应的等级 有符号整数类型(如果有)。 对于所有整数类型 T1、T2 和 T3,如果 T1 的秩大于 T2 并且 T2 具有 排名大于 T3,则 T1 排名大于 T3
【讨论】:
【参考方案8】:我今天也在做同样的事情。我的结论是它取决于执行程序的机器架构的字长。 根据 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
如果有人有更好的答案,请告诉我。
【讨论】:
只是添加试试这个 短整数 i = 2147483647; printf("%d %d %d\n",i, i+1,i+10); int i = 2147483647; printf("%d %d %d\n",i, i+1,i+10); 我在 64 位机器上工作,测试人员观察翻转问题是很好的观察【参考方案9】:short 和 int 必须至少为 16 位,long 必须至少为 32 位,并且该 short 不长于 int,即不长于 long。通常,short 是 16 位,long 是 32 位,int 是 16 位或 32 位。
【讨论】:
【参考方案10】:这取决于编译器。 在某些编译器中,int 是 2 个字节,而在其他编译器中是 4 个字节。
【讨论】:
感谢您的贡献 - 但是这个答案提供了其他 11 个答案中尚未说明的内容?以上是关于C中的“short int”和“int”有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
c语言中如何将short,int,long,float这些类型的数值转换为字符串?
c语言中如何将short,int,long,float这些类型的数值转换为字符串?