こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

VC6でlong longでエラー?

VC++6で、void test(unsigned long long a){}
の場所で、error C2632: 'long' と 'long' の 2 つの型指定子のあいだにコードがありません。というエラーが発生します。

unsigned long longはVCで動作するものでしょうか?

投稿日時 - 2007-02-10 10:51:56

QNo.2739902

困ってます

質問者が選んだベストアンサー

★『64Bit』の整数について
・『Java』言語では 64 ビット整数を正式にサポートしていますが、C 言語では処理系依存になります。
・『VC6』にはあまり詳しくありませんが、『long long』はマイクロソフト社系では使えません。
 その代わりに、妙な型が定義されていて『__int64』、『LONGLONG』、『LARGE_INTEGER』など3つほど
 64ビット整数を扱うような型が存在します。

●LARGE_INTEGER 共用体
typedef union union {
 struct {
  DWORD LowPart; // 飼い32ビット整数(符号なし)
  LONG HighPart; // 上位32ビット整数(符号付き)
 };
 LONGLONG QuadPart; // 64ビット整数(符号付き)
} LARGE_INTEGER, *PLARGE_INTEGER;

●関数
LONGLONG Int32x32To64( LONG a, LONG b ); // 掛け算(a×b=64ビットの符号付き整数を返す)
ULONGLONG UInt32x32To64( DWORD a, DWORD b ); // 掛け算(a×b=64ビットの符号なし整数を返す)
ULONGLONG Int64ShllMod32( ULONGLONG a, DWORD shift ); // 論理左シフト(a << shift の符号なし整数を返す)
ULONGLONG Int64ShrlMod32( ULONGLONG a, DWORD shift ); // 論理右シフト(a >> shift の符号なし整数を返す)
LONGLONG Int64ShraMod32( ULONGLONG a, DWORD shift ); // 算術右シフト(a >> shift の符号付き整数を返す)


最後に:
・詳しい関数の内容は、MSDN のマニュアルを見て下さい。
・また、上記で紹介した共用体と関数は『Microsoft Visual Studio .NET 2003 C/C++』です。
・最初に紹介した『__int64』は『_』『_』『int64』です。『_』が2つ先頭に付きます。
・以上。おわり。

投稿日時 - 2007-02-10 16:57:11

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

すでに long longはVC6では使えないことは書かれていますが、

C99ではlong long はサポートすべき型の中にありますから、
C99をサポートしていると謳っている処理系ならば処理系依存ということはありません。

Visual Studio 2005のVC(VC8)ならばlong longが使えます。

C++ Reference Guide > A Tour of C99
http://www.informit.com/guides/content.asp?g=cplusplus&seqNum=215&rl=1

x64で本格化する64ビットWindowsの時代(5):ITpro
http://itpro.nikkeibp.co.jp/article/COLUMN/20051124/225141/?ST=cpu

STLでも問題続出ですし、VC6でなければならない理由がないのなら
早めに移行することをお勧めします。

投稿日時 - 2007-02-10 17:53:59

ANo.4

long long型は、元々はGCCなどが共通の拡張としてサポートしていた型ですが、C99からは標準でサポートされるようになりました。C++の場合は、現時点では非標準ですが、次期改定時には標準に取り込まれることでしょう。

Visual C++に関してですが、long long型がサポートされるのはVisual C++.NET 2003からです。したがって、残念ながらVisual C++ 6.0ではサポートされていません。どうしても使いたいのであれば、__int64に置き換えるしかないわけですが、できれば__int64を直接使わず、typedefで何らかの別名を付けた方がよいでしょう。将来的な互換性を考えると、<stdint.h>または<cstdint>を自作して、std::tr1::int_least64_tを使うのも一つの手です。

投稿日時 - 2007-02-10 17:50:38

ANo.2

VC++6のヘルプをみたら
hyper
という64ビット整数のタイプがあるようです。

投稿日時 - 2007-02-10 12:31:00

ANo.1

long longは元々ANSI C標準じゃないから対応できないコンパイラもある。(C99には入ったのかな?)
VCだと__int64が使えるんじゃないかな。
# 詳細はヘルプで確認して

投稿日時 - 2007-02-10 12:19:02