• ベストアンサー

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

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

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

  • ベストアンサー
  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.3

long longはANSI-Cの新しい改訂版C99で正式に採用されました。 C99以前のANSI-C対応処理系では独自拡張(gccなど)です。 環境の指定が無いので独自拡張は無視してANS-C99について解答します。 long longまたはlong long int=64ビット符号付き整数 unsigned long longまたはunsigned long long int=64ビット符号無し整数 定数の場合はLL(=long long)またはLLU(=unsigned long long)を付加する。 LL,LLU小文字でもよい。 1LL,0LL,100000000000lluなど long long系の整数使うライブラリ関数について ・printf/scanf系書式の追加 %lld(=long long) および%llu(=unsigned long long) ・その他ライブラリ関数 文字列整数化:strtollが用意される。 現状では日本語で読めるC99の包括的な資料は存在しません。 英語版で良ければC99のドラフトが参考URLで読むことができます。

参考URL:
http://anubis.dkuug.dk/JTC1/SC22/WG14/

その他の回答 (2)

  • xinman
  • ベストアンサー率30% (25/83)
回答No.2

long long も unsigned long long も新しく追加された型です。 long long:64bit -9223372036854775808~9223372036854775807 unsigned long long:64bit 0~18446744073709551615 という型で64bitであること以外は他の型とshortやlongなどと同じように演算に使用できます。 ただし、新しい型ですので、従来のコンパイラでは対応していない場合が考えられます。

peacenik
質問者

補足

ありがとうございます。 longやshortと同じ用に使用できると言う事ですが、printfなどを使用して 表示したり、sprintfなどを使用する場合はどのようにしたら良いでしょうか? 書式制御文字が分かりません。 あと、atol()やltoa()などの関数を使用する場合などでは、ライブラリなど 新しいものが要るのでしょうか?

  • x-game
  • ベストアンサー率42% (80/189)
回答No.1

こんにちは. 下記のサイトを参考にすると,よくわかると思います. unsignedとは正の整数ということです.

参考URL:
http://www.geocities.co.jp/SiliconValley/1002/c99d/c99d05.htm
peacenik
質問者

お礼

ありがとうございます。 早速確認します。 いろいろと勉強してきます。

関連するQ&A

  • unsigned long long 型のフォーマット指定子

    unsigned long long 型の変数の値を表示したいのですが、 フォーマット指定子は%ldですか? よろしくおねがいします。

  • 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バイト整数を使用するとこのような演算が行われるのかが分からないので、演算順序や型変換の優先順位がどのように行われいるのか説明できる方教えてください。

  • 数値型 変数の型

    「51100078248」という資料番号を数値型で変数に格納したいのですが long型だとオーバーフローしてしまいます。 この場合は何型の変数の型に格納すればいいでしょうか?

  • ポインタ変数を変数に渡す方法

    (int * 型)ポインタ変数に代入されたアドレスを、(普通の)int 型変数に代入したいのですが、どのようにするのが正しいのでしょうか。 想定しているケースは、与えられたメモリ番地に対して、アドレスオフセットを加えるなどの操作を施して「補正アドレス」を生成し、メモリアクセスを行う、というような特殊な操作を実現するような場合です。 ※ メモリ番地がポインタ宣言で与えられる、という制約があります。 以下サンプルプログラムを書きました。組み込み系のプログラムを記述していますが、これで正しいでしょうか。 unsigned int *p, *p1; // ポインタ変数宣言 unsigned int value; p= (unsigned int *)0x00001F00; // メモリの0x1F00番地 value = p; // <-- ここが心配 value |= 0xCC << 16; // 与えられたアドレスから value &= 0x4 << 12; // 「補正アドレス」生成 p1 = (unsigned int *)value; *p1 = 0xA5A5_A5A5; // 「補正アドレス」にA5A5... をライト C言語初心者で、いろいろなサイトを見てみたのですが、説明されているページが見つからず質問させていただきました。どうぞよろしくお願いします。

  • 変数の型を定義しなかった場合どうなりますか?

    現在、VBAを使ってプログラミングを行っているところなのですが、 一般的に、プログラムの最初で変数に対してintegerやlongといった型を定義してから使うというように教わりますが、このように型を定義しなくとも使うことが出来ます。もし定義しなかった場合、その変数の型は何に設定されているのでしょうか? では型を定義するメリット及び、せずに使った場合のデメリットは何なのでしょうか? 私が使っているのはVBAですが、他の言語では型を定義しなければ、その変数を使うことが出来ないというようなものもあるのでしょうか?

  • 変数の型について

    VBA初心者です。 変数っていうのはその用途に合わせて方を宣言しますよね。 例)Dim r As Integer ですが稀に型が無い宣言があります。 例)Dim r そういうのはどういう時に使用するのですか? また、どういう風に解釈されるのでしょうか?

  • unsigned *という宣言について

    char *str = "\x01\x23\x45\x67\x89\xab\xcd\xef"; unsigned *u = (unsigned *)(str + 1); このようなコードをみかけたのですが、 unsigned *uという宣言が理解できません。 これはどのような型として解釈されているのでしょうか? 暗黙でunsigned int* uと解釈されるのでしょうか?

  • MicroC コンパイラ 変数宣言

    MicroC コンパイラ 変数宣言について質問です BYTE tmp1; WORD tmp2; なる定義があったとして 変数型範囲はどの範囲になるのでしょう 下記の定義は見つかったのですが 上記は分かりません 変数型 バイト数 範囲 (unsigned) char 1 0 .. 255 signed char 1 - 128 .. 127 (signed) short (int) 1 - 128 .. 127 unsigned short (int) 1 0 .. 255 (signed) int 2 -32768 .. 32767 unsigned (int) 2 0 .. 65535 (signed) long (int) 4 -2147483648 .. 2147483647 unsigned long (int) 4 0 .. 4294967295 float 4 ±1.17549435082 * 10-38 .. ±6.80564774407 * 1038 double 4 ±1.17549435082 * 10-38 .. ±6.80564774407 * 1038 long double 4 ±1.17549435082 * 10-38 .. ±6.80564774407 * 1038

  • unsigned int型と int型の型変換の上位性

    if(-10<1u)の条件判定はunsigned型で評価され偽となります。 int型 unsigned int型とも32ビットで考えたとき、 1u = 0x00000001 -10 = 0xfffffff6で10進法では4294967286になります。 条件判定をunsigned型で考えれば確かに-10<1uは偽になり int型で考えれば-10<1uは真になります。 「通常の算術変換」によれば、「一方のオペランドがunsigned int型をもつ時、他のオペランドをunsigned int型に型変換するとあります。」 よって、if(-10<1u)の条件判定はunsigned型で評価され偽となりますが、 「一方のオペランドがint型をもつ時、他のオペランドをint型に型変換する。」では何故いけないのでしょうか? 宜しく願います。

  • 128ビット変数の符合表現について

    C言語で符号付128ビット変数を4つの32ビット変数(signed longまたはunsigned long)で表現したいと思っています。 この場合32ビット変数の符合付き/符合なしはどのように組み合わせるのが適切なのでしょうか。 一応3通りの方法を考えてはみました。 (1)が適切な気もするのですが違う気もします。 アドバイスをお願いします。 (1) 最上位32ビット変数をsigned longにして残りの3つの32ビット変数はunsigned longにする。 (2) 4つの32ビット変数を全てsigned longにする。 (3) 4つの32ビット変数を全てunsigned longにする。

専門家に質問してみよう