ページ 1 / 1
unsigned long long の範囲
Posted: 2010年9月05日(日) 21:20
by みけCAT
Dev-C++ 4.9.9.2を使ってプログラムを書いています。
コンパイラはデフォルトを使用しています。
#include <stdio.h>
int main(void) {
unsigned long long a=0xffffffffffffffff;
long long b=0xffffffffffffffff;
printf("%ld %ld\n",a,b);
return 0;
}
このソースをコンパイルしてみたのですが、整数が大きすぎる(たぶん)と怒られます。
具体的なエラーメッセージはこれです。
D:\(中略)\test.c In function `main':
4 D:\(中略)\test.c [Warning] integer constant is too large for "long" type
5 D:\(中略)\test.c [Warning] integer constant is too large for "long" type
long long型のサイズは8バイトだと思ったのですが、なぜ怒られるかわかりません。
sizeof(a)は8になっています。
もしかしたら1.0fのfのようなものを付けるのかと想像したのですが、あくまで想像です。
Re:unsigned long long の範囲
Posted: 2010年9月05日(日) 21:27
by たかぎ
-pedanticオプションが付いているのでは?
Re:unsigned long long の範囲
Posted: 2010年9月05日(日) 21:31
by みけCAT
「コンパイラを呼ぶ際、以下のオプションを付加する」欄には何も入力していません。
チェックもついていません。
-pedanticオプションを付けると以下のエラーが出ました。
In file included from C:/Dev-Cpp/include/stdio.h:26,
from D:\(中略)\test.c:1:
C:/Dev-Cpp/include/stddef.h:6:2: warning: #include_next is a GCC extension
In file included from C:/Dev-Cpp/include/stdio.h:28,
from D:\(中略)\test.c:1:
C:/Dev-Cpp/include/stdarg.h:6:2: warning: #include_next is a GCC extension
In file included from D:\(中略)\test.c:1:
C:/Dev-Cpp/include/stdio.h:330: warning: ISO C90 does not support `long long'
In file included from C:/Dev-Cpp/include/sys/types.h:21,
from C:/Dev-Cpp/include/stdio.h:399,
from D:\(中略)\test.c:1:
C:/Dev-Cpp/include/stddef.h:6:2: warning: #include_next is a GCC extension
In file included from C:/Dev-Cpp/include/stdio.h:399,
from D:\(中略)\test.c:1:
C:/Dev-Cpp/include/sys/types.h:32: warning: ISO C90 does not support `long long'
C:/Dev-Cpp/include/sys/types.h:110: warning: ISO C90 does not support `long long'
C:/Dev-Cpp/include/sys/types.h:115: warning: ISO C90 does not support `long long'
In file included from D:\(中略)\test.c:1:
C:/Dev-Cpp/include/stdio.h:416:14: warning: use of C99 long long integer constant
D:\(中略)\test.c: In function `main':
D:\(中略)\test.c:4: warning: ISO C90 does not support `long long'
D:\(中略)\test.c:4: warning: integer constant is too large for "long" type
D:\(中略)\test.c:5: warning: ISO C90 does not support `long long'
D:\(中略)\test.c:5: warning: integer constant is too large for "long" type
Re:unsigned long long の範囲
Posted: 2010年9月05日(日) 22:14
by たかぎ
GCCのバージョンと正確なコンパイルオプションが分からないと何ともいえないのですが、整数定数に添字 LL を付ければ警告はなくなると思います。
ところで、%ld は long 型のための書式なので、long long 型を使うときは %lld でなければなりません。
しかし、MinGW は Visual C++の printf を使っているので、%lld が使えません。
しかたがないので %I64d にすることになると思います。
Re:unsigned long long の範囲
Posted: 2010年9月05日(日) 22:23
by みけCAT
添字LLを付けたら解決しました。
ありがとうございました。
Re:unsigned long long の範囲
Posted: 2010年9月06日(月) 08:56
by バグ
今回は、unsigned long long型ですから、%I64uではないのでしょうか?
勘違いだったらごめんなさい。どうしても気になったもので…(^_^;)
Re:unsigned long long の範囲
Posted: 2010年9月06日(月) 09:00
by たかぎ
> 今回は、unsigned long long型ですから、%I64uではないのでしょうか?
オール1のビットパターンを与えて、それが-1になることを確認したかったのでは?
符号の有無だけなら異なっても問題ないので、%I64d でよいと思うのですが、いずれにせよ、%ld ではダメです。
Re:unsigned long long の範囲
Posted: 2010年9月06日(月) 09:07
by バグ
>>たかぎさん
ありがとうございました。
肝心要なトピ主のソースをよく読まずにいたので、トンチンカンなことを聞いてしまいました。
失礼しましたm(_ _)m