int v/s。长在C

int v/s。长在C,c,int,long-integer,C,Int,Long Integer,在我的系统上,我得到: sizeof ( int ) = 4 sizeof ( long ) = 4 当我用C程序检查时,int&long在以下时间后溢出到负值: a = 2147483647; a++; 如果两者都可以表示相同的数字范围,为什么我要使用long关键字?int的最小范围为-32767到32767,而long的最小范围为-2147483647到2147483647 如果您正在编写可能需要在不同C实现上编译的可移植代码,那么如果需要该范围,您应该使用long。如果你只为一个特定

在我的系统上,我得到:

sizeof ( int )  = 4
sizeof ( long ) = 4
当我用C程序检查时,
int
&
long
在以下时间后溢出到负值:

a = 2147483647;
a++;

如果两者都可以表示相同的数字范围,为什么我要使用
long
关键字?

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


如果您正在编写可能需要在不同C实现上编译的可移植代码,那么如果需要该范围,您应该使用
long
。如果你只为一个特定的实现编写不可移植的代码,那么你是对的——这无关紧要。

我认为这更像是当今的编译器问题,因为计算机已经变得更快,需要更多的数字,就像以前一样。

在不同的平台上或使用不同的编译器,int和long可能不同。
如果您不打算将代码移植到其他任何机器或使用其他机器,那么选择您想要的机器,这不会有什么区别。

这取决于编译器,您可能需要检查一下:

因为sizeof(int)==sizeof(long)并不总是正确的。int normaly表示至少有2*8位的最快大小。另一方面,long至少是4*8位。

内置数据类型的大小取决于C实现,但它们都具有最小范围。现在,int通常是4字节长(32位),因为大多数操作系统是32位的。请注意,char始终为1字节。

C定义了许多整数类型,并指定了它们的大小关系。基本上,它说的是sizeof(long-long)>=sizeof(long)>=sizeof(int)>=sizeof(short)>=sizeof(char),而sizeof(char)==1

但是实际大小没有定义,这取决于您运行的体系结构。在32位PC上,int和long通常为4个字节,long-long为8个字节。但在64位系统上,long通常是8字节,因此与int不同

还有一种称为uintptr__t(和intptr__t)的类型,它保证具有与数据指针相同的大小


要记住的重要一点是,不要假设您可以(例如)将指针值存储在long或int中。可移植性可能比您想象的更重要,而且您可能希望在不久的将来在64位系统上编译代码。

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


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

尝试在64位模式下编译代码,看看是否得到相同的结果。例如,在64位模式下,它们是不同的。int对于两种模式(至少在Solaris上)都是32位的,但正如您所说的,它在不同的平台上有所不同。当大小重要时,请使用
stdint.h
中的类型。在大多数情况下,需要的是最低保证范围,在这种情况下,标准类型就足够了。在您的需求较窄的情况下,
中的类型可能会很有用。应该注意的是,POSIX要求
int
至少为32位,当然Windows有32位
int
。在Windows和任何POSIX系统上运行的代码的可移植性肯定高于平均水平。:-)sizeof(char)将始终为1,但char_位不必为8。拥有32位字符是完全合法的,如果int也是32位,那么sizeof(int)将是1。我从来没有听说过非8位字节。POSIX需要
CHAR\u bit==8
,当然Windows也有
CHAR\u bit==8
,所以无论出于何种目的,
CHAR\u bit
都是8。值得注意的例外是古老的传统大型机(基本上不相关,其中
CHAR\u-BIT
通常为9或10)和DSP(其中
CHAR\u-BIT
可能为32和
sizeof(CHAR)
sizeof(short)
sizeof(int)
,以及
sizeof(long)
all 1.还有一些DSP的字符位不是8;我已经为其中的一个进行了编码,其中字符位是16,sizeof(int)==sizeof(short)==sizeof(CHAR)==1。请注意,“CHAR”(未指定符号)的要求“int”表示这样一个系统上的“char”必须签名。我在C89标准中找不到这样一个段落,它说sizeof(long)>=sizeof(int)。因此我认为允许sizeof(long)(绝对值)与所示值相同。@Juri Robl:在C89标准中,§3.1.2.5说“在上面的有符号整数类型列表中,每种类型的值的范围是列表中下一种类型的值的子范围。”。在C99标准中,它是§6.2.5p8(整数转换秩较小的类型的范围必须是整数转换秩较大的类型的子范围)以及§6.3.1.1p1(
long int
的整数转换秩大于
int
)。