C Int 和 Long 32 - 64 位的值范围



我对 C 中 Int 变量的值范围感到困惑。

我知道 32 位无符号 int 的范围是:0 到 65,535。这么长有 0 到 4,294,967,295

这在 32 位机器中很好。但是现在在 64 位机器中,所有东西都保持不变?或者也许我的 int 容量不同?

我作为新手理解这个问题,但我真的很困惑。此方法签名也无济于事。:)

unsigned long long int atomicAdd(unsigned long long int* address, unsigned long long int val);

在 C 和 C C++中,您有这些最低要求(即实际实现可以具有更大的量级(

signed char: -2^07+1 to +2^07-1
short:       -2^15+1 to +2^15-1
int:         -2^15+1 to +2^15-1
long:        -2^31+1 to +2^31-1
long long:   -2^63+1 to +2^63-1

现在,在特定实现上,您有各种各样的位范围。维基百科的文章很好地描述了这一点。

不,C 中的int定义为 32 位。 intlong根本没有定义为任何特定大小。语言唯一保证的是 sizeof(char)<=sizeof(short)<=sizeof(long) .

理论上,编译器可以使shortcharlong的位数相同。我知道有些人实际上对所有这些类型都这样做了,除了char.

这就是为什么 C 现在定义了像 uint16_tuint32_t 这样的类型。如果您需要特定尺寸,则应使用其中之一。

自K&R:

short通常是 16 位、long 32 位,int 16 位或 32 位。每个编译器都可以自由选择适合自己的大小 硬件,仅受 short s 和 int 的限制 至少 16 位,long s 至少为 32 位,short 不是 长于int,不长于long


您可以使用包含十进制/浮点类型限制定义的limits.h

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <float.h>

int main(int argc, char** argv) {
    printf("CHAR_BIT    :   %dn", CHAR_BIT);
    printf("CHAR_MAX    :   %dn", CHAR_MAX);
    printf("CHAR_MIN    :   %dn", CHAR_MIN);
    printf("INT_MAX     :   %dn", INT_MAX);
    printf("INT_MIN     :   %dn", INT_MIN);
    printf("LONG_MAX    :   %ldn", (long) LONG_MAX);
    printf("LONG_MIN    :   %ldn", (long) LONG_MIN);
    printf("SCHAR_MAX   :   %dn", SCHAR_MAX);
    printf("SCHAR_MIN   :   %dn", SCHAR_MIN);
    printf("SHRT_MAX    :   %dn", SHRT_MAX);
    printf("SHRT_MIN    :   %dn", SHRT_MIN);
    printf("UCHAR_MAX   :   %dn", UCHAR_MAX);
    printf("UINT_MAX    :   %un", (unsigned int) UINT_MAX);
    printf("ULONG_MAX   :   %lun", (unsigned long) ULONG_MAX);
    printf("USHRT_MAX   :   %dn", (unsigned short) USHRT_MAX);
    printf("FLT_MAX     :   %gn", (float) FLT_MAX);
    printf("FLT_MIN     :   %gn", (float) FLT_MIN);
    printf("-FLT_MAX    :   %gn", (float) -FLT_MAX);
    printf("-FLT_MIN    :   %gn", (float) -FLT_MIN);
    printf("DBL_MAX     :   %gn", (double) DBL_MAX);
    printf("DBL_MIN     :   %gn", (double) DBL_MIN);
    printf("-DBL_MAX     :  %gn", (double) -DBL_MAX);
    return (EXIT_SUCCESS);
}

也许您可能需要在计算机上进行一些调整,但这是一个很好的模板,可以开始了解(实现定义的(最小值和最大值。

没有一个答案。 该标准定义了最小范围。 int 必须能够容纳至少 65535。 然而,大多数现代编译器允许整数为 32 位值。 此外,没有什么可以阻止多种类型具有相同的容量(例如 int 和 long(。

话虽如此,标准确实在您的特定情况下说:

0 → +18446744073709551615

作为无符号长长 int 的范围。

延伸阅读: http://en.wikipedia.org/wiki/C_variable_types_and_declarations#Size

事实上,大多数现代处理器(ARM,Intel/AMD,Alpha,SPARC,Itanium,PowerPC(上的无符号int的范围为0到2^32 - 1,即4,294,967,295 = 0xffffffff因为 int(有符号和无符号(的长度为 32 位,最大的长度如前所述。

(无符号空头的最大值为 2^16 - 1 = 65,535 (

(无符号(长 long long int 的长度为 64 位(long int 在大多数情况下就足够了64 位 Linux 等,但标准承诺 64 位用于长 int(。因此,它们的范围为 0 到 2^64 - 1 = 18446744073709551615

在 C 和 C++ 中某些变量的内存要求:


signed char: -2^07 to +2^07-1
short: -2^15 to +2^15-1
int: -2^15 to +2^15-1
long: -2^31 to +2^31-1 long long: -2^63 to +2^63-1


signed char: -2^07 to +2^07-1
short: -2^15 to +2^15-1
int: -2^31 to +2^31-1
long: -2^31 to +2^31-1 long long: -2^63 to +2^63-1

取决于编译器和硬件架构

C语言的国际标准只要求短变量的大小应小于或等于int类型的大小,而int类型又应小于或等于long类型的大小。

看看 limits.h.您可以找到编译器的特定值。INT_MIN和INT_MAX会很有趣。

看看系统中的limits.h文件,它会告诉系统特定的限制。或选中man limits.h并转到"数值限制"部分。

32 位无符号 int 的范围为 0 到 4,294,967,295。 0 到 65535 将是 16 位无符号。

无符号长长(在 64 位实现中,可能还有 ulong 和可能还有 uint(的范围(至少(从 0 到 18,446,744,073,709,551,615 (264-1(。从理论上讲,它可能比这更大,但至少目前这种情况很少见甚至不存在。

最好包括stdlib.h。因为没有标准libg需要很长时间

最新更新