在C++中,`int`是默认的`signed long int`吗?

qaz*_*wsx 12 c++ types

int默认signed long int在C++?

它是平台和/或编译器依赖的吗?如果是这样,怎么样?

[编辑]

以下任何一项保证是重复的吗?

signed short int
signed int
signed long int
signed long long int
unsigned short int
unsigned int
unsigned long int
unsigned long long int
Run Code Online (Sandbox Code Playgroud)

Ben*_*igt 25

plain int是签名的,无论它是否与long int平台相关的大小相同.

这有什么保证

sizeof (int) <= sizeof (long)
Run Code Online (Sandbox Code Playgroud)

并且int足以容纳至少从-32767到32767的所有值.


标准说的是:(部分[basic.fundamental]:

有五种标准符号整数类型:signed char,short int,int,long int,和long long int.在此列表中,每种类型至少提供与列表中前面的存储一样多的存储空间.也可能存在实现定义的扩展有符号整数类型.标准和扩展有符号整数类型统称为有符号整数类型.普通ints具有执行环境架构所建议的自然大小; 提供其他有符号整数类型以满足特殊需求.

  • +1,对于其他读者:第一句中有一个重要的细节:`int`和`signed long int`是**永远不是**相同*类型*,但它们可以具有相同的*size*. (7认同)

Die*_*ühl 12

所有整数类型都不同,即您可以安全地为所有这些类型重载函数,并且不会发生任何冲突.但是,有时使用相同数量的位来表示它们.即使它们使用相同数量的有符号和无符号类型,也总是具有不同的范围.除了char使用任何整数类型不signed等同于使用它与signed,即,signed intint是相等的.char是一个不同的类型signed char,unsigned charchar具有相同的表示和范围signed char或任何一个或unsigned char.您可以使用它std::numeric_limits<char>::is_signed来找出它使用的内容.

关于更有趣的方面.以下条件都是正确的:

  • 7 <= std::numeric_limits<signed char>::digits
  • sizeof(char) == 1
  • sizeof(char) == sizeof(signed char)
  • sizeof(char) == sizeof(unsigned char)
  • 15 <= std::numeric_limits<short>::digits
  • sizeof(char) <= sizeof(short)
  • sizeof(short) <= sizeof(int)
  • 31 <= std::numeric_limits<long>::digits
  • sizeof(int) <= sizeof(long)
  • 63 <= std::numeric_limits<long long>::digits
  • sizeof(long) <= sizeof(long long)
  • sizeof(X) == sizeof(signed X)
  • sizeof(signed X) == sizeof(unsigned X)

(其中"X"是一个char,short,int,long,和long long).

这意味着所有整数类型的大小可以相同,只要这种类型至少保持64位(显然Cray X-MP就是这样的野兽).在现代机器上通常sizeof(int) == sizeof(long)但有机器在哪里sizeof(int) == sizeof(short).无论long是32位还是64位取决于实际的架构,目前这两种类型都存在.


cHa*_*Hao 7

平原int相当于signed int.这很标准.过去的任何事都无法保证; int并且long是不同的类型,即使您的特定编译器使它们具有相同的大小.你唯一的保证是,long至少一样大的int.


Joh*_*itb 5

longshort修饰不完全喜欢signedunsigned.后两个可以放在任何整数类型上,但是如果你把它们关掉,那么它signed是每个整数类型的默认值(除外char).所以int并且signed int是相同的类型.

对于longshort,如果你将它们关闭,则不会选择,但结果类型是不同的.long int,short int并且int都是不同的类型,short int<= int<= long int.

intlong,short,signedunsigned是可选的:signed intsigned是同一类型.