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

Cus*_*dio 44 c int 32bit-64bit

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

我知道32位unsigned 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);
Run Code Online (Sandbox Code Playgroud)

Joh*_*itb 69

在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
Run Code Online (Sandbox Code Playgroud)

现在,在特定实现中,您有各种位范围.在维基百科的文章介绍了这个好听.

  • 很抱歉在很长一段时间后发表评论,但我感觉C遵循2的补码算术,其中值位于[-2 ^(N-1),2 ^(N-1)-1]的N位数据类型.你能否验证这一点(下端点没有额外的1)? (3认同)
  • @Custodio你使用`unsigned long long`,这意味着你的范围至少为'0 .. 2 ^ 64-1`. (2认同)

T.E*_*.D. 19

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

理论上编译器可以使short,charlong所有相同的比特数.我知道有些人确实为所有这些类型保存了char.

这就是为什么C现在定义类似uint16_t和的类型uint32_t.如果您需要特定尺寸,则应该使用其中一种尺寸.

  • 这就是我在Linux系统(GCC)上得到`sizeof(int)`= 4和`sizeof(long)`= 4的原因.因为,没有特定的尺寸,而是_min size_. (5认同)

Ely*_*Ely 18

来自K&R的摘录:

short通常是16位,long32位和int16位或32位.每个编译器都可以自由选择适合自己硬件的大小,只受shorts和ints至少为16位,longs至少为32位short且不超过的限制int,不超过long.


您可以使用limits.h包含decimal/float类型限制的定义:

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


int main(int argc, char** argv) {

    printf("CHAR_BIT    :   %d\n", CHAR_BIT);
    printf("CHAR_MAX    :   %d\n", CHAR_MAX);
    printf("CHAR_MIN    :   %d\n", CHAR_MIN);
    printf("INT_MAX     :   %d\n", INT_MAX);
    printf("INT_MIN     :   %d\n", INT_MIN);
    printf("LONG_MAX    :   %ld\n", (long) LONG_MAX);
    printf("LONG_MIN    :   %ld\n", (long) LONG_MIN);
    printf("SCHAR_MAX   :   %d\n", SCHAR_MAX);
    printf("SCHAR_MIN   :   %d\n", SCHAR_MIN);
    printf("SHRT_MAX    :   %d\n", SHRT_MAX);
    printf("SHRT_MIN    :   %d\n", SHRT_MIN);
    printf("UCHAR_MAX   :   %d\n", UCHAR_MAX);
    printf("UINT_MAX    :   %u\n", (unsigned int) UINT_MAX);
    printf("ULONG_MAX   :   %lu\n", (unsigned long) ULONG_MAX);
    printf("USHRT_MAX   :   %d\n", (unsigned short) USHRT_MAX);
    printf("FLT_MAX     :   %g\n", (float) FLT_MAX);
    printf("FLT_MIN     :   %g\n", (float) FLT_MIN);
    printf("-FLT_MAX    :   %g\n", (float) -FLT_MAX);
    printf("-FLT_MIN    :   %g\n", (float) -FLT_MIN);
    printf("DBL_MAX     :   %g\n", (double) DBL_MAX);
    printf("DBL_MIN     :   %g\n", (double) DBL_MIN);
    printf("-DBL_MAX     :  %g\n", (double) -DBL_MAX);

    return (EXIT_SUCCESS);
}
Run Code Online (Sandbox Code Playgroud)

也许你可能需要在你的机器上稍微调整一下,但它是一个很好的模板,可以开始了解(实现定义的)最小值和最大值.


Joe*_*Joe 9

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

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

0 ? +18446744073709551615
Run Code Online (Sandbox Code Playgroud)

作为unsigned long long int的范围.

进一步阅读:http://en.wikipedia.org/wiki/C_variable_types_and_declarations#Size