何时使用不同的整数类型?

Mic*_*ael 11 math size types programming-languages

编程语言(例如c,c ++和java)通常有几种类型用于整数运算:

  • signedunsigned类型
  • 种类型的不同大小的:short,int,long,long long
  • 保证和非保证(即依赖于实现)大小的类型:
    例如int32_tvs int(我知道这int32_t不是语言的一部分)

当你应该使用它们时,你会如何总结?

Jon*_*Jon 9

默认的整数类型(int)在几乎所有语言中都获得了"等于第一"的优惠待遇.因此,如果不存在偏好其他类型的理由,我们可以将其用作默认值.

这些原因可能是:

  • 如果您知道需要额外的范围,请使用较大的类型;如果您想节省内存并且不介意较小的范围,请使用较小的类型.
  • 如果您打算使用位移运算符(<<>>),请使用无符号类型确保在整数表示中没有任何"额外"1 .
  • 如果该语言不保证类型的最小(或甚至固定)大小(例如,C/C++与C#/ Java),并且您关心其属性,则应该更喜欢某种生成具有保证大小的类型的机制(例如int32_t) - 如果您的程序是可移植的并且预计将使用不同的编译器进行编译,则这变得更加重要.

更新(扩展保证大小类型)

我个人认为,没有保证固定大小的类型比现在更麻烦.我不会深入了解产生它们的历史原因(简要地说:源代码可移植性),但事实是,在2011年,很少有人(如果有的话)从中受益.

另一方面,使用这些类型时可能会出现许多问题:

  • 结果证明没有必要的范围
  • 您访问底层内存以获取变量(可能是序列化它),但由于处理器的字节顺序和类型的非固定大小,您最终会引入一个错误

由于这些原因(并且可能还有其他原因),使用这些类型在理论上是一个主要的痛苦.此外,除非要求极端的便携性,否则您根本无法获益.事实上,typedef的整个目的int32_t就是完全消除松散大小类型的使用.

实际上,如果您知道您的程序不会被移植到另一个编译器或体系结构,您可以忽略这些类型没有固定大小的事实,并将它们视为编译器使用它们的已知大小. .

  • 对于安全有用的固定大小的无符号类型,需要保证对它们的操作实际上将使用相关类型执行.否则`uint32_t x = 1,y = 2,z = 0; if(xy <z)blah()`将在某些机器上执行该条件而不在其他机器上执行. (4认同)

Kir*_*rov 6

一个接一个问题:

  1. signed并且unsigned:取决于你需要什么.如果您确定,该号码将是未签名的 - 请使用unsigned.这将使您有机会使用更大的数字.例如,a signed char(1B)的范围是[-128:127],但是如果是unsigned- 最大值加倍(你还有一个位使用 - 符号位,所以unsigned char可能是255(所有位都是1)

  2. short,int,long,long long-这些都是非常清楚的,不是吗?最小的整数(除外char)是short,下一个是int,等等.但这些是平台相关的 - int可能是2B(很久以前:D),4B(通常).long可能是4B(在32位平台上),或8B(在64位平台上),等等long long不是C++中的标准类型(它将在C++ 0x中),但通常它是一个typedef int64_t.

  3. int32_tvs int- int32_t和其他类型的这种类型保证了它们的大小.例如,int32_t保证是32位,而正如我已经说过的那样,大小与int平台有关.