web-dev-qa-db-ja.com

C IntおよびLong 32-64ビットの値の範囲

CのInt変数の値の範囲と混同しています。

32ビットの符号なし整数の範囲が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);
44
Custodio

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

現在、特定の実装では、さまざまなビット範囲があります。 wikipediaの記事 はこれをうまく説明しています。

いいえ、Cのintは32ビットであると定義されたnotです。 intおよびlongは、特定のサイズにまったく定義されていません。言語が保証する唯一のものは、sizeof(char)<=sizeof(short)<=sizeof(long)です。

理論的には、コンパイラはshortchar、およびlongをすべて同じビット数にすることができます。私はいくつかのことを知っています 実際にそうしました すべてのこれらのタイプはcharを保存します。

これが、Cがuint16_tuint32_tなどの型を定義するようになった理由です。特定のサイズが必要な場合は、それらのいずれかを使用することになっています。

19
T.E.D.

K&Rからの抜粋:

shortは多くの場合16ビット、long 32ビット、intは16ビットまたは32ビットです。各コンパイラは、shortsおよびintsが少なくとも16ビット、longsが少なくとも32ビット、shortintより長くなく、longより長くありません。


Decimal/float型の制限の定義を含むlimits.hを利用できます:

#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);
}

マシン上で少し調整する必要があるかもしれませんが、(実装定義の)最小値と最大値の概念を理解するための良いテンプレートです。

18
Ely

誰も答えはありません。標準では、最小範囲が定義されています。 intは少なくとも65535を保持できる必要があります。ただし、最新のコンパイラのほとんどは、intを32ビット値にすることができます。さらに、複数のタイプが同じ容量を持つことを妨げるものは何もありません(たとえば、intとlong)。

そうは言っても、標準はあなたの特定のケースで言う:

0 → +18446744073709551615

符号なしlong long intの範囲として。

さらに読む: http://en.wikipedia.org/wiki/C_variable_types_and_declarations#Size

9
Joe

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言語の国際標準では、short変数のサイズはint型のサイズ以下でなければならず、int型のサイズはlong型のサイズ以下でなければなりません。

2
Vipin Diwakar

実際、ほとんどの最新プロセッサー(ARM、Intel/AMD、Alpha、SPARC、Itanium、PowerPC)の符号なしintの範囲は0から2 ^ 32-1です。これは、int(符号付きおよび符号なし)が4,294,967,295 = 0xffffffffになるためです。 32ビット長で、最大のものは記載されているとおりです。

(符号なしshortの最大値は2 ^ 16-1 = 65,535です)

(符号なし)long long intの長さは64ビットです(ほとんどの64ビットLinuxなどではlong intで十分ですが、標準ではlong long intに64ビットが約束されています)。したがって、これらの範囲は0〜2 ^ 64-1 = 18446744073709551615です。

2
Henno Brandsma

システムのlimits.hファイルを見て、システム固有の制限を確認してください。または、man limits.hを確認して、「数値の制限」セクションに進みます。

1
phoxis

limits.h を見てください。コンパイラの特定の値を見つけることができます。 INT_MINおよびINT_MAXは重要です。

1
Paul Rubel

32ビットの符号なし整数の範囲は0〜4,294,967,295です。 0〜65535は、16ビットの符号なしです。

符号なしlong long(および64ビット実装では、おそらくulongおよびおそらくuintも)の範囲は(少なくとも)0〜18,446,744,073,709,551,615(264-1)。理論的にはそれより大きくなる可能性がありますが、少なくとも今のところは存在しないことはまれです。

0
Jerry Coffin