C言語関係掲示板

過去ログ

No.1237 int型以上の数値

[戻る] [ホームページ]
No.2258

intとlongについて
投稿者---クワトロ(2004/07/08 14:15:58)


C言語を勉強し始めたばかりで、このサイトを発見し勉強させていただいてます。いきなり質問なんですが、私のパソコンでは
sizeof(int)とsizeof(long)が同じ4バイトと表示されます。
Borlandの5.5を使ってます。WinXPです。
で、int型でもlong型でも扱える数値の範囲が同じっぽいのですが、
どのようにすればlong型として扱える(int型以上の数値を扱える)のでしょうか?
試してみたいのが、int型同士の掛け算でint型を越える数値になったときに、long型に変換したのとint型のまま出力した差を確認したいと思ってます。
ご存知の方教えてください。
宜しくお願いします。



No.2259

Re:intとlongについて
投稿者---円零(2004/07/08 15:51:08)


いや、どうすればもこうすればも、long int型が4バイトなのは使用されてる環境によって決まってるわけで。
int型を越える範囲を扱いたいなら_intn型を使うしかないでしょう。
私の環境はVC++6.0ですのでBorlandのことは良くわかりませんが、以下のコードは動きますか?

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

int main(void){
    int i = INT_MAX;
    _int64 j;
    char s[33];

    j = (_int64)i + 1;
    i++;
    _i64toa(j, s, 10);    
    printf("i = %d\n", i);
    printf("j = %s", s);
    return 0;
}



No.2268

Re:intとlongについて
投稿者---クワトロ(2004/07/09 10:51:33)


>いや、どうすればもこうすればも、long int型が4バイトなのは使用されてる環境によって決まってるわけで。
>int型を越える範囲を扱いたいなら_intn型を使うしかないでしょう。
>私の環境はVC++6.0ですのでBorlandのことは良くわかりませんが、以下のコードは動きますか?
>
><pre>#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

int main(void){
int i = INT_MAX;
_int64 j;
char s[33];

j = (_int64)i + 1;
i++;
_i64toa(j, s, 10);
printf("i = %d\n", i);
printf("j = %s", s);
return 0;
}
</pre>

ありがとうございました。
上記のプログラムを貼り付けてコンパイルしてみましたが、
どうやら「_int64 j;」がらみのところでエラーとなります。
long int型というものがあるとは知りませんでした。
それでやってみます。
本当にありがとうございました。



No.2273

Re:intとlongについて
投稿者---円零(2004/07/09 11:19:32)


>上記のプログラムを貼り付けてコンパイルしてみましたが、
>どうやら「_int64 j;」がらみのところでエラーとなります。
やっぱり頭に"_"がついてるのはマイクロソフトの独自の拡張のようですね。
なんかMSDNヘルプ見たら「Microsoft 固有の仕様」の欄の外に書いてあったので
もしかしたらと思ったんですが(調べが甘くてすみません)。
それと、"_int64"などというのを見ればひょっとするとヘルプファイルの検索に役立つかもと。
NykRさんの仰るInt64みたいな…
(でも"Int64"ではコンパイラに認識されてもらえなかったそうで残念です)。


>long int型というものがあるとは知りませんでした。
>それでやってみます。
あ、ええと、long int型というのはlong型のことです。
新しい規格C99だとlong long intと言う型があって、これならOKのはずなんですが、
bcc 5.5では対応してないという噂(因みにウチのVC++6.0も×)。


No.2276

Re:intとlongについて
投稿者---ぽこ(2004/07/09 11:57:08)


>>どうやら「_int64 j;」がらみのところでエラーとなります。
>やっぱり頭に"_"がついてるのはマイクロソフトの独自の拡張のようですね。

__int64ってのがある模様。




No.2260

Re:intとlongについて
投稿者---ぽこ(2004/07/08 16:23:07)


>試してみたいのが、int型同士の掛け算でint型を越える数値になったときに、long型に変換したのとint型のまま出力した差を確認したいと思ってます。

intとlongが同じサイズであれば、クワトロさんがやりたいことは
出来ないと思います。
"long long int"を使用してみてはどうでしょうか?



No.2269

Re:intとlongについて
投稿者---クワトロ(2004/07/09 10:59:13)


>>試してみたいのが、int型同士の掛け算でint型を越える数値になったときに、long型に変換したのとint型のまま出力した差を確認したいと思ってます。
>
>intとlongが同じサイズであれば、クワトロさんがやりたいことは
>出来ないと思います。
>"long long int"を使用してみてはどうでしょうか?

ありがとうございます。
「long long int」と変数を宣言しましたが、「宣言に型が多すぎる」と
エラーになってしまいました。
「long int」ならコンパイルできました。
しかし、long int型をsizeofというのを使って
printf("%d",sizeof(long int));
とやってみますと、4と表示されました。
4ということはできないんでしょうか・・・。


No.2261

Re:intとlongについて
投稿者---NykR(2004/07/08 16:55:56)


>どのようにすればlong型として扱える(int型以上の数値を扱える)のでしょうか?

int型の値をlong型の値として扱いたいのなら、long型の変数に代入するかキャストすればいいです。

但し、int型とlong型の幅が同じときは、扱える値の範囲も同じなので、long型にしてもint型の範囲を超える値にはなりません。


>試してみたいのが、int型同士の掛け算でint型を越える数値になったときに、long型に変換したのとint型のまま出力した差を確認したいと思ってます。

int型同士の演算の結果は必ずint型になります。
結果の値がint型を超えるような場合にどうなるかは処理系定義です。
結果が(INT_MAXの剰余をとるとかして)ちゃんと値になった場合、それをより大きい整数型に変換しても、値は変わりません。

ですから、変換は演算の前にしなければなりません。
それでもlongとintの幅が同じなら値は変わりませんが。

ですから、差を確認したいならlongよりも大きい整数で比較する必要があるでしょう。
標準Cでは64ビット(以上)の整数がいくつか用意されています。
long long int, int64_t, int_least64_t, int_fast64_t, intmax_t, ...

BorlandだとInt64型があったと思います(よく知らない)。


No.2270

Re:intとlongについて
投稿者---クワトロ(2004/07/09 11:02:29)


>>どのようにすればlong型として扱える(int型以上の数値を扱える)のでしょうか?
>
>int型の値をlong型の値として扱いたいのなら、long型の変数に代入するかキャストすればいいです。
>
>但し、int型とlong型の幅が同じときは、扱える値の範囲も同じなので、long型にしてもint型の範囲を超える値にはなりません。
>
>
>>試してみたいのが、int型同士の掛け算でint型を越える数値になったときに、long型に変換したのとint型のまま出力した差を確認したいと思ってます。
>
>int型同士の演算の結果は必ずint型になります。
>結果の値がint型を超えるような場合にどうなるかは処理系定義です。
>結果が(INT_MAXの剰余をとるとかして)ちゃんと値になった場合、それをより大きい整数型に変換しても、値は変わりません。
>
>ですから、変換は演算の前にしなければなりません。
>それでもlongとintの幅が同じなら値は変わりませんが。
>
>ですから、差を確認したいならlongよりも大きい整数で比較する必要があるでしょう。
>標準Cでは64ビット(以上)の整数がいくつか用意されています。
>long long int, int64_t, int_least64_t, int_fast64_t, intmax_t, ...
>
>BorlandだとInt64型があったと思います(よく知らない)。
ありがとうございました。
intにもいろんなのがあるんだなぁと勉強になります。
そういうのはどこを見たらそう言った型があるのがわかるのでしょうか?
私はまだその辺もわかってないので、お手数おかけしますが、教えていただけたら幸いです。
それと、Int64という型で変数を宣言しましたが、コンパイルエラーになりました。
もしかして、何かincludeしないといけないのでしょうか?




No.2277

Re:intとlongについて
投稿者---NykR(2004/07/09 12:01:35)


>intにもいろんなのがあるんだなぁと勉強になります。

いろんなのがあるのは整数型でintはint型ひとつだけですね。


>そういうのはどこを見たらそう言った型があるのがわかるのでしょうか?

JISかISOかANSIの規格書をみると載っています。
あとプログラミング言語 C の新機能など。


>それと、Int64という型で変数を宣言しましたが、コンパイルエラーになりました。

Int64はDelphiでした。<おい

__int64というのがあるらしいです。
http://www.google.co.jp/search?hl=ja&ie=UTF-8&c2coff=1&q=Borland+C%2B%2B+5.5+64%E3%83%93%E3%83%83%E3%83%88%E6%95%B4%E6%95%B0&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja
http://www.google.co.jp/search?hl=ja&ie=UTF-8&c2coff=1&q=Borland+C%2B%2B+5.5+__int64&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja