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);
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)
です。
理論的には、コンパイラはshort
、char
、およびlong
をすべて同じビット数にすることができます。私はいくつかのことを知っています 実際にそうしました すべてのこれらのタイプはchar
を保存します。
これが、Cがuint16_t
やuint32_t
などの型を定義するようになった理由です。特定のサイズが必要な場合は、それらのいずれかを使用することになっています。
K&Rからの抜粋:
short
は多くの場合16ビット、long
32ビット、int
は16ビットまたは32ビットです。各コンパイラは、short
sおよびint
sが少なくとも16ビット、long
sが少なくとも32ビット、short
はint
より長くなく、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);
}
マシン上で少し調整する必要があるかもしれませんが、(実装定義の)最小値と最大値の概念を理解するための良いテンプレートです。
誰も答えはありません。標準では、最小範囲が定義されています。 intは少なくとも65535を保持できる必要があります。ただし、最新のコンパイラのほとんどは、intを32ビット値にすることができます。さらに、複数のタイプが同じ容量を持つことを妨げるものは何もありません(たとえば、intとlong)。
そうは言っても、標準はあなたの特定のケースで言う:
0 → +18446744073709551615
符号なしlong long intの範囲として。
さらに読む: http://en.wikipedia.org/wiki/C_variable_types_and_declarations#Size
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型のサイズ以下でなければなりません。
実際、ほとんどの最新プロセッサー(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です。
システムのlimits.h
ファイルを見て、システム固有の制限を確認してください。または、man limits.h
を確認して、「数値の制限」セクションに進みます。
limits.h を見てください。コンパイラの特定の値を見つけることができます。 INT_MINおよびINT_MAXは重要です。
32ビットの符号なし整数の範囲は0〜4,294,967,295です。 0〜65535は、16ビットの符号なしです。
符号なしlong long(および64ビット実装では、おそらくulongおよびおそらくuintも)の範囲は(少なくとも)0〜18,446,744,073,709,551,615(264-1)。理論的にはそれより大きくなる可能性がありますが、少なくとも今のところは存在しないことはまれです。