int v/s. long in C

4

在我的系统上,我得到:

sizeof ( int )  = 4
sizeof ( long ) = 4

当我用C程序检查时,intlong在以下情况下都会溢出为负数:

a = 2147483647;
a++;

如果两者都能表示同样范围的数字,为什么我还要使用 long 关键字呢?

尝试以64位模式编译您的代码,看看是否得到相同的结果。 - JeremyP
8个回答

7

int 的最小范围为-32767到32767,而long的最小范围为-2147483647到2147483647。

如果您编写的代码可能需要在不同的C实现上编译,则应使用long,如果需要这个范围。 如果您只编写针对一个特定实现的非便携式代码,则无所谓。


4
在需要考虑大小的情况下,请使用stdint.h中定义的数据类型。 - Paul R
2
在大多数情况下,我们需要的是一个最小保证范围,这种情况下标准类型已经足够了。但如果你的需求更为严格,那么<stdint.h>中的类型会很有用。 - caf
需要注意的是,POSIX要求int至少为32位,当然Windows也有32位的int。在Windows和任何POSIX系统上都能工作的代码肯定具有高度的可移植性。 :-) - R.. GitHub STOP HELPING ICE

6

因为sizeof(int)==sizeof(long)并不总是成立的。int通常代表至少2*8位的最快速度。而long则至少为4*8位。


它们在64位模式下是不同的,例如,在Solaris上,int类型在两种模式下都是32位,但正如你所说,这在不同平台上可能会有所变化。 - Chris Huang-Leaver

5

C语言定义了一些整型数据类型并指定了它们之间的大小关系。基本上,它表明 sizeof(long long) >= sizeof(long) >= sizeof(int) >= sizeof(short) >= sizeof(char),且 sizeof(char) 等于 1。

但实际的大小没有被定义,而是依赖于你所运行的系统架构。在 32 位 PC 上,int 和 long 通常是四个字节,long long 是 8 个字节。但在 64 位系统上,long 通常是 8 个字节,因此与 int 不同。

还有一个名为 uintptr_t(和 intptr_t)的类型,保证具有与数据指针相同的大小。

重要的是要记住不要假设你可以将指针值存储在 long 或 int 中。具备可移植性可能比你想象的更加重要,而且很可能你会在不久的将来想在 64 位系统上编译你的代码。


我在C89标准中找不到一段话,说明sizeof(long) >= sizeof(int)。所以我认为sizeof(long) < sizeof(int)是允许的? - Juri Robl
@Juri,来自2.2.4.2数字限制:它们的实现定义值应该等于或大于(绝对值)所示的值,并具有相同的符号。 - Christoffer
1
@Juri Robl:在C89标准中,§3.1.2.5说:“在上面的有符号整数类型列表中,每种类型的值范围是下一个类型值范围的子范围。”。在C99标准中,它是§6.2.5p8(具有较小整数转换等级的类型的范围必须是具有较大整数转换等级的类型的子范围),以及§6.3.1.1p1(long int的整数转换等级高于int)。 - caf

0

我认为这更多是一个编译器问题,因为现在计算机运行得更快,需要处理更多的数字,而以前则不然。


0

在不同的平台或使用不同的编译器时,int 和 long 可能会有所不同。 如果您不打算将代码移植到其他地方或使用不同的机器,则选择您想要的那个,这不会有任何影响。


0

0

内置数据类型的大小根据C语言实现的不同而变化,但它们都有最小范围。现在,int通常是4字节长(32位),因为大多数操作系统都是32位。请注意,char始终为1个字节。


1
sizeof(char) 的值永远为1,但 CHAR_BITS 不一定是8。拥有32位字符是完全合法的,如果 int 类型也是32位,那么 sizeof(int) 的值将会是1。 - Sjoerd
我从未听说过非8位字节。 - Alexander Rafferty
POSIX要求CHAR_BIT==8,当然Windows也有CHAR_BIT==8,因此在大多数情况下,CHAR_BIT等于8。值得注意的例外是古老的遗留主机(大多数情况下没有影响),其中CHAR_BIT通常为9或10;以及DSPs(其中CHAR_BIT可能为32,而sizeof(char)sizeof(short)sizeof(int)sizeof(long)均为1)。 - R.. GitHub STOP HELPING ICE
也有一些 DSP 的 CHAR_BIT 不是8;我编写过一个其中 CHAR_BIT 是16,且 sizeof(int)==sizeof(short)==sizeof(char)==1。请注意,对于未指定符号的 'char' 可以适应 'int' 的要求意味着在这样的系统上 'char' 必须带符号。 - supercat

0

数据类型的大小取决于编译器。不同的编译器具有不同大小的int和其他数据类型。

因此,如果您编写的代码将在不同的机器上运行,则应使用long或者取决于变量可能具有的值的范围。


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