unsigned long long の範囲

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
みけCAT

unsigned long long の範囲

#1

投稿記事 by みけCAT » 15年前

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 の範囲

#2

投稿記事 by たかぎ » 15年前

-pedanticオプションが付いているのでは?

みけCAT

Re:unsigned long long の範囲

#3

投稿記事 by みけCAT » 15年前

「コンパイラを呼ぶ際、以下のオプションを付加する」欄には何も入力していません。
チェックもついていません。
-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 の範囲

#4

投稿記事 by たかぎ » 15年前

GCCのバージョンと正確なコンパイルオプションが分からないと何ともいえないのですが、整数定数に添字 LL を付ければ警告はなくなると思います。

ところで、%ld は long 型のための書式なので、long long 型を使うときは %lld でなければなりません。
しかし、MinGW は Visual C++の printf を使っているので、%lld が使えません。
しかたがないので %I64d にすることになると思います。

みけCAT

Re:unsigned long long の範囲

#5

投稿記事 by みけCAT » 15年前

添字LLを付けたら解決しました。
ありがとうございました。

バグ

Re:unsigned long long の範囲

#6

投稿記事 by バグ » 15年前

今回は、unsigned long long型ですから、%I64uではないのでしょうか?
勘違いだったらごめんなさい。どうしても気になったもので…(^_^;)

たかぎ

Re:unsigned long long の範囲

#7

投稿記事 by たかぎ » 15年前

> 今回は、unsigned long long型ですから、%I64uではないのでしょうか?

オール1のビットパターンを与えて、それが-1になることを確認したかったのでは?
符号の有無だけなら異なっても問題ないので、%I64d でよいと思うのですが、いずれにせよ、%ld ではダメです。

バグ

Re:unsigned long long の範囲

#8

投稿記事 by バグ » 15年前

>>たかぎさん
ありがとうございました。
肝心要なトピ主のソースをよく読まずにいたので、トンチンカンなことを聞いてしまいました。
失礼しましたm(_ _)m

閉鎖

“C言語何でも質問掲示板” へ戻る