• ベストアンサー

Long Int と Int の使い分けは

NINJA104の回答

  • NINJA104
  • ベストアンサー率43% (133/306)
回答No.1

単純なint形はプラットフォーム依存で4バイトになったり2バイトになったりします。 32bitの環境ではおっしゃる様に4バイトですが、16bitの環境では2バイトになってしまうという事です。 単純に値だけの参照を行うコードを書く分には問題は発生しませんが、ポインタ参照などで例えば4バイトを前提にアドレスの増減を行って書き換えや参照を行うと、バグの原因になります。 long intという定義は、どのプラットフォームでも*明確*に4バイトを定義します。対してshort intという定義もあり、こちらは2バイトです。 つまり、32bitプラットフォームに依存するコードであれば、intでもlong intでも同じです。お好きな方で書いてください。 プラットフォーム依存を無くしたい場合は、明確にする為にも単なるint定義は止めた方が良いでしょう。 サイズ(バイト数)が気になる場合は、sizeof()を利用してください。

関連するQ&A

  • intとlongは同じ?

    #include <stdio.h> #include <limits.h> int main() { printf("%d\n%d", INT_MAX, LONG_MAX); return 0; } 出力 214783647 214783647 Win7 64bit (VC++2010) CentOS 32bit (gcc) どちらの環境でも同じ出力結果となりました。 intとlongなぜ同じになってしまったのでしょうか。

  • for(int i = 100, long n = 1; i > n/3i; i++)

    for(int i = 100, long n = 1; i > n/3i; i++) のように、初期設定で型の違う変数を宣言したいんだけど C++ではこんなふうに2つ以上の型を宣言してはいけないんですか?

  • long型がint型に認識されてしまいます

    今、JAVAを勉強中なのですが、 public class Hensu{ public static void main(String[] args){ long yosan = 79686000000000; System.out.println("平成18年の国家予算="+yosan); } } これをコンパイルしようとすると Hensu.java:5: 整数 79686000000000 が大き過ぎます。 と返ってきます。 桁数を変えて試した所int型の範囲内でならコンパイル出来ます。 何が間違っているのでしょうか?? ついでに、こういった分からない事を調べるにはどうすればよいでしょうか? 検索してみましたが良いキーワードが思いつかず質問するしか方法がなくなってしまいました。

    • ベストアンサー
    • Java
  • c++でunsigned long long intを用いるには

    OS(ディストリビューション)はubuntuです。 この質問の目標は表題のように 「c++でunsigned long long intを使えるようにすること」 です。なお、マシンは32bitなので64bitよりは遅くなります。 http://www.wdic.org/w/TECH/long%20long まずgccのバージョンは、gcc --versionによると、 gcc (GCC) 3.3.5 (Debian 1:3.3.5-8ubuntu2.1) でした。そこで、gccのバージョンを3.4.4以上に しようと考えました。 (↓の人は3.4.4でできているらしい。 http://qune.cside.com/archives/000959.html) そこで、 http://webos-goodies.jp/archives/50899271.html にそってgccをアップデートしようとしましたが、 /etc/portage/ というディレクトリはありませんでした。次に、 http://www.gentoo.org/doc/ja/gcc-upgrading.xml にそってgccをアップデートしようとしましたが、 emergeというコマンドは入っていませんでした。 さて、質問は以下の通りです。 1.「目標」を達成するのにこのルートはあっているのでしょうか? 2.あっているのなら、emergeのインストール法を教えてください。 3.あっていないなら、どのようにしたら「目標」を達成できるでしょうか?

  • C言語signed long long型の演算

    C言語で以下の演算を行った場合、変数bに格納される値が-1(0xFFFFFFFFFFFFFFFF)になることを期待しておりましたが、参照すると4294967295(0x00000000FFFFFFFF)となってしまいます。 unsigned int a = 1; signed long long b; b = a * (-1); 32bit、64bitのUNIX(Solaris)マシンでそれぞれ確認しましたが、どちらも同じ結果となりました。 変数aの型宣言をsigned intにすると変数bが-1(0xFFFFFFFFFFFFFFFF)になることは確認したのですが、unsigned intだとなぜこのような演算結果となるのかが分かりません。 ※8バイト整数に格納する際に先頭4バイトがなぜ0xFFFFFFFFで補完されないのか? ちなみに変数bの型宣言をsigned long intにすると32bitマシンでは-1となりましたが、64bitマシンでは4294967295となってしまいます。 これは32bitUNIXマシンではsigned long intは4バイト領域であるため-1(0xFFFFFFFF)となり、64bitUNIXマシンでは8バイト領域のため前述と同じ結果になるのだと考えますが、なぜ8バイト整数を使用するとこのような演算が行われるのかが分からないので、演算順序や型変換の優先順位がどのように行われいるのか説明できる方教えてください。

  • 変数の前についているnってもしかしてint型を示しているのでしょうか?

    変数の前についているnってもしかしてint型を示しているのでしょうか? long型ならl, bool型ならbを頭に付けるのは分かるのですが,intはiでないのでしょうか? また、それぞれの型と、接頭語の対応も教えていただけないでしょうか? int nLen; // intのn? long lHeight;// longのl bool bStart; // boolのb これまで気にしてなかったのですが、自分でlong型にはlを付けているので、 全て書式を統一した方が良いかな、と思い質問しました。

  • char型・int型を相互変換させるプログラミング

    今、C++で2つのPC間で数値データの送受信を出来るようにしようと思い、実際にデータを飛ばせるところまで来たのですが、送れるデータの型はchar型のみであるとのこと。 ですので、intの値を一旦charにして送り、送った先でまたintにしたらいいかなと考えてプログラミングしました。 簡単にできると思ったのですが、上手くいきません・・・。プログラムのどの部分が間違っているのでしょうか? 一人では、これ以上悩んでも好転しないので、皆さんのご指導をお願いします 以下プログラム抜粋、このプログラムでは型変換がおこなわれているかの確認ができればいいので、それのみでプログラミングしています =================================================== #include <stdio.h> #include <stdlib.h> #include <string> #include <iostream> int main() { int a=123; char *b=new char; int c=1; //変換部分 *b=(char)a; std::cout<<"int→char>>>"<< c << "\n"; //逆変換部分 d=atoi(c); std::cout<<"char→int>>>"<< d << "\n"; } ======================================================

  • 変数の型でlong longとunsigned long longと言うのは何ですか?

    教えていただきたいのですが、変数の型にlong longやunsigned long long なるものがあると聞いたのですが、どのようなものでしょうか? また、どのように宣言するのでしょうか?通常のlongなどと同じ要領で宣言し てやれば良いのでしょうか? もし、この型がある場合に、制約はあるのでしょうか?Unixでしか使えないとか の制約等ありましたらぜひ教えてください。 お願いいたします。

  • long型のランダムな値を返す方法

    C言語について質問させて頂きます。 私は今、0以上50万以下(上限は50万以上ならどんな値でもかまいません)の範囲でランダムに整数を得たいと考えております。 #include <stdlib.h>のint rand(void)は0以上の乱数を返してくれますが、返す値はintの範囲内(?)なので、要望に合っておりません。 そこで、long型のランダムな値を得たいと思っております。 一体、どのような関数またはアルゴリズムを使えば、望むように出来るのでしょうか? 是非、お教えください。

  • C/C++の型について

    Windows2000で、VC++6で型のサイズを調べると、以下のとおりでした。 int 4バイト long 4バイト long int 4バイト 環境はWindows2000, CPUはCeleron1200Mhzです。 環境やコンパイラによって型のサイズや呼び方も変わるのでしょうか? VisualBasic6用のDLLをVCで作成した記憶があるのですが、そのときは VB6のInteger型が2バイトだったので C(Ver7.0?????)側も2バイトだったと思います。 今VB6のInteger型にあわせる場合はC側ではshortでないとおかしくなるのでしょうか? 私はブランクがあり、そのあたりの事情がよくわかっていません。 あるサイトのページを見ると intが2バイトで、 long intは同じ4バイトで long long intという型もありました。VC6++では long long intは無いようです。 http://seclan.dll.jp/c99d/c99d05.htm VC2005++やGCCでは8バイトの型はあるのでしょうか?