C言語におけるlong longの使い方



C言語におけるlong longの使い方
2010年05月31日月曜日午後05:53
http://www.awuit.com/c-language-the-usage-of-long-long/
阿呉|C/C+|十一月、03 2009|5 Comments
BTコードを解析する過程で、long long line_という定義に遭遇した.position;とても退屈で、C言語の中で私はまだこのような書き方を見たことがなくて、ネット上で探して、資料も少なくて、最後にC言語の標準と実現のこの本の中でlong longについての言い方を見つけました.C言語のC 99標準では新しい整数型long longが拡張され、longは32ビット幅で4バイトを占めている.long longは通常64ビット幅と定義されているが、32ビットマシンで8バイト拡張できるデータを実現することができ、GUN Cもサポートしている.もちろん64ビットプラットフォームではこの問題がある.C 99規格は、あるプラットフォーム上のある整数タイプがどれだけのバイトを占有しているのか、どの程度の範囲の数値を表すことができるのかなどを硬く規定していないが、原則と参照数値の集合を与え、この2つの条件を同時に満たす限り、C規格に合致している.その後、C 99規格を確認しました:—The rank of long long int shall be greater than the rank of long int,which shall be greater than the rank of int,which shall be greater than the rank of short int,which shall be greater than the rank of signed char.
long longのレベルはlongより高く、longのレベルはintより高く、intのレベルはshortより高く、shortのレベルはcharより高いという意味です.(さらに、_Boolは常に最下位レベルである).レベルの高い整数タイプの幅は、レベルの低い整数タイプ以上である.コンパイルlong longは、C 99規格のコンパイラをサポートする必要があり、VCはサポートしていないが、対応するタイプ__int64がある
C++ __int 64の使い方http://341871.blog.51cto.com/331871/71253
変換元:[url]http://www.cnitblog.com/cockerel/archive/2006/08/16/15356.html[/url]
C++の64ビット整数[元]by赤ウサギ
ACMの問題をするとき、よく大きな整数に遭遇します.一般的に使用される内蔵整数タイプは、longおよびintの範囲が[-2^31,2^31)、すなわち-2 14748648~2174748647であり、unsignedの範囲は[0,2^32)、すなわち0~4294967295である.すなわち、従来の32ビット整数は40億以下の数しか処理できない.
では、40億より大きい数に遭遇したらどうしますか?このときC++の64ビット拡張が用いられる.64ビット整数の拡張は、コンパイラによって異なります.ACMの必要性に基づいて、以下ではVC 6についてのみ説明する.0とg++コンパイラの拡張.
VCの64ビット整数をそれぞれ__と呼ぶint 64とunsigned_int64,その範囲はそれぞれ[-2^63,2^63)と[0,2^64]であり、すなわち-922337203685475808~922337203685475807と0~18446744073709551615(約1800億)である..64ビット整数の演算は32ビット整数とほぼ同じで、4則演算やビット演算などがサポートされています.64ビットと32ビットの混合演算を行うと、32ビット整数は暗黙的に64ビット整数に変換される.ただし、VCの入出力は_int 64の互換性はあまりよくありません.このようなコードを書くと:
1 __int64 a;
2 cin >> a;
3 cout << a;
では、2行目に「error C 2679:binary'>>':no operator defined which takes a right-hand operand of type'_int 64'(or there is no acceptable conversion)」というエラーが表示されます.3行目に「error C 2593:'operator<'is ambiguous」というエラーが表示されます.それは入出力ができないのではないでしょうか.もちろんいいえ、Cの書き方を使ってもいいです.
scanf("%I64d",&a);
printf("%I64d",a);
出力を正しく入力できます.unsigned__を使用する場合int 64の場合、「I 64 d」を「I 64 u」に変更すればよい.
OJは通常g++コンパイラを使用する.その64ビット拡張方式はVCとは異なり、それぞれlong longとunsigned long longと呼ばれている.処理規模は,入出力以外の使用方法と同様である.入出力の場合、VCよりも拡張性が優れています.使用可能
1 long long a;
2 cin>>a;
3 cout<使用することもできます
scanf("%lld",&a);
printf("%lld",a);
符号なし数を使用する場合は「%lld」を「%llu」に変更すればよい.
最後に、特例として、Dev-C++のg++コンパイラを使用している場合は、「%lld」ではなく「%I 64 d」を使用しています.
__int 64のprintf問題!http://blog.chinaunix.net/u/19782/showart_403061.html
LinuxのものをWindowsの下に移植して、問題は本当に多くて、時にはとてもおかしいと感じます!今日は1つ出会った!
__int 64はWindowsの下でどのように出力する問題ですか?強制転換の時に問題があったのかと思って、長い間調べました!
次はテストコードです.Windws、Linuxの2つのプラットフォームのテストに合格しました.#include <stdio.h>

#ifdef _WIN32
typedef unsigned __int64 uint64_t;
#else
typedef unsigned long long uint64_t;
#endif

typedef unsigned int uint32_t;
typedef unsigned short uint16_t;
typedef unsigned char uint8_t;

int main(int argc, char *argv[])
{
uint32_t t321, t322, t323;
uint64_t t641, t642, t643;
uint8_t *p;

uint8_t t[64] =
{
0x4E, 0x7C, 0x00, 0x00, 0x00, 0x00,
0x4E, 0x7C, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x00, 0x00
};

printf(
"sizeof(uint64_t) = %d
"
"sizeof(uint32_t) = %d
"
, sizeof(uint64_t), sizeof(uint32_t));

p = t;
t321 = *(uint32_t *)p; p += 6;
t322 = *(uint32_t *)p; p += 6;
t323 = *(uint32_t *)p; p += 6;

printf("t321[%X].%d t322[%X].%d t323[%X].%d
"
, t321, t321, t322, t322, t323, t323);

p = t;
t641 = *(uint32_t *)p; p += 6;
t642 = *(uint32_t *)p; p += 6;
t643 = *(uint32_t *)p; p += 6;

#ifdef _WIN32
printf("t641[%I64X].%I64d t642[%I64X].%I64d t643[%I64X].%I64d
"
, t641, t641, t642, t642, t643, t643);
#else
printf("t641[%llX].%lld t642[%llX].%lld t643[%llX].%lld
"
, t641, t641, t642, t642, t643, t643);
#endif

t641 = 0x1122334455667788;

#ifdef _WIN32
printf("%I64X %I64d
", t641, t641);
#else
printf("%llX %lld
", t641, t641);
#endif

return 0;
}
/*
Test Env:
    Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
    Microsoft Windows 2000 [Version 5.00.2195]

Result:
sizeof(uint64_t) = 8
sizeof(uint32_t) = 4
t321[7C4E].31822 t322[7C4E].31822 t323[4].4
t641[7C4E].31822 t642[7C4E].31822 t643[4].4
1122334455667788 1234605616436508552

--------------------------------------
Test Env:
    gcc version 3.2.3 20030502 (Red Hat Linux 3.2.3-47.3)

Result:
sizeof(uint64_t) = 8
sizeof(uint32_t) = 4
t321[7C4E].31822 t322[7C4E].31822 t323[4].4
t641[7C4E].31822 t642[7C4E].31822 t643[4].4
1122334455667788 1234605616436508552
*/


#ifdef _WIN32
#  define APR_UINT64_T_HEX_FMT     "llx"
#else
#  define APR_UINT64_T_HEX_FMT     "I64x"
#endif

example:
     sprintf(buf, "%" APR_UINT64_T_HEX_FMT, var);

#define HOST_WIDEST_INT_PRINT_DEC       "%I64d"
#define HOST_WIDEST_INT_PRINT_UNSIGNED  "%I64u"
#define HOST_WIDEST_INT_PRINT_HEX       "0x%I64x"