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

このQ&Aに関連する最新のQ&A

A 回答 (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/
    • good
    • 1

long long も unsigned long long も新しく追加された型です。


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

この回答への補足

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

補足日時:2001/03/27 12:00
    • good
    • 1

こんにちは.


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

参考URL:http://www.geocities.co.jp/SiliconValley/1002/c9 …
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/03/27 15:05

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

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

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

Aベストアンサー

規格上は、%llu のように ll を付けます。(unsigned long longなので、%lld ではなく %llu です。)
ただし、C99に準拠した処理系ではなく、単に独自拡張としてlong long型をサポートしている場合には、%Lu とか %qu とかになる場合もあります。場合によっては、long long型が存在する処理系でも、printf系関数で正しく書式化する方法が存在しないこともあり得ます。

Qunsigned long 'aufx' から C Strings "aufx" への方法

unsigned long の値が例えば'aufx'が入っていたとして
その値を元にC Stringsの"aufx" もしくは NSString の @"aufx"を作りたいのですがどのようにしたらよいでしょう。
目的はNSDictionary の key にしたいのですが

//includeされています
//typedef unsigned long FourCharCode;
//typedef FourCharCode OSType;


OSType osType;
osType = kAudioUnitType_Effect; //'aufx' 61756678
char no1;
char no2;
char no3;
char no4;
char osTypeStrings[5];

no1 = (osType>>24)|(osType<<8);
no2 = (osType>>16)|(osType<<16);
no3 = (osType>>8)|(osType<<24);
no4 = osType;

osTypeStrings[0] = no1;//'a'
osTypeStrings[1] = no2;//'u'
osTypeStrings[2] = no3;//'f'
osTypeStrings[3] = no4;//'x'
osTypeStrings[4] = '?0';


のようにしてもうまくいかず
いろいろ試したのですがうまくいかないのですが
どのようにすればベストですか?
もっと簡潔な方法もありますか?
解る方、すみませんがよろしくお願いします。

unsigned long の値が例えば'aufx'が入っていたとして
その値を元にC Stringsの"aufx" もしくは NSString の @"aufx"を作りたいのですがどのようにしたらよいでしょう。
目的はNSDictionary の key にしたいのですが

//includeされています
//typedef unsigned long FourCharCode;
//typedef FourCharCode OSType;


OSType osType;
osType = kAudioUnitType_Effect; //'aufx' 61756678
char no1;
char no2;
char no3;
char no4;
char osTypeStrings[5];
...続きを読む

Aベストアンサー

unsigned long x=0x61756678;
char s[5];
unsigned char mask=0xff;
s[0] = (x>>24)&mask;
s[1] = (x>>16)&mask;
s[2] = (x>> 8)&mask;
s[3] = x&mask;
s[4] = '\0';
とかでどうでしょうか。

Qlong long型について

以前、下記質問をさせてもらいました。
http://okwave.jp/qa3407843.html

回答して頂いた内容では、
コンパイラによって利用可能、不可能とのことですが、
コンパイラの種類とはどう確認すればよいのでしょうか?
※無知で申し訳ありません。

また32ビットOS、64ビットOSとかはまったく関係ないのでしょうか?

以上、よろしく御願い致します。

Aベストアンサー

> コンパイラの種類とはどう確認すればよいのでしょうか?

#include <stdio.h>

int
main(void)
{
printf("long long:\t%d byte\n", sizeof(long long));
printf("long:\t%d byte\n", sizeof(long));
printf("int:\t%d byte\n", sizeof(int));
printf("long double:\t%d byte\n", sizeof(long double));
printf("double:\t%d byte\n", sizeof(double));
printf("float:\t%d byte\n", sizeof(float));
return 0;
}
をコンパイルしてみればよいと思います。

> また32ビットOS、64ビットOSとかはまったく関係ないのでしょうか?

OSとは直接は無関係ですが、64 bit OSは、64 bit CPUに載せます。
intは、8byteにするのが効率が良く、sizeof(int) = sizeof(long long)と実装することになるでしょう。

> コンパイラの種類とはどう確認すればよいのでしょうか?

#include <stdio.h>

int
main(void)
{
printf("long long:\t%d byte\n", sizeof(long long));
printf("long:\t%d byte\n", sizeof(long));
printf("int:\t%d byte\n", sizeof(int));
printf("long double:\t%d byte\n", sizeof(long double));
printf("double:\t%d byte\n", sizeof(double));
printf("float:\t%d byte\n", sizeof(float));
return 0;
}
をコンパイルしてみればよいと思います。

> また3...続きを読む

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

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だとなぜこのような演算結果となるのかが分かりま...続きを読む

Aベストアンサー

unsigned int の 1 と int の -1 を掛けるので
1. int の -1 を unsigned int に変換する. その結果は 42....
2. unsigned int の 1 と上で得られた値を掛ける. もちろん結果は 42....
んで, その結果を signed long long に入れるので (値が保存されて) 42....

ということでは.

Qunsigned 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型に型変換する。」では何故いけないのでしょうか?
宜しく願います。

Aベストアンサー

> <符号無し整数型から符号付き整数型に変換する際、元の値が表現できなければ、>
> とは、具体的にどのような場合をいうのでしょうか?

例えば、

unsigned int a = UINT_MAX;
int b = (int)a;

とした場合、aの値はUINT_MAXであり、int型の表現範囲に収まりません。
具体的には、int型が32ビットで負値を2の補数で表現する処理系であれば、int型の表現範囲は-2147483648~+2147483647になりますから、UINT_MAXの値(4294967295)を表現することができません。

> <処理系定義の値になるか処理系定義のシグナルが発生します。>

int型の負値の表現方法は、2の補数以外に、1の補数や符号ビット+絶対値が考えられます。これらの場合にUINT_MAXをint型にキャストするとどんな値になるか考えてみてください。
処理系定義のシグナルというのは、例えばオーバーフロー例外(プロセッサがハード的に発生させる割り込みのようなものと考えてください)が発生して、結果として何らかのシグナルハンドラが呼び出されるかもしれないことを意味しています(シグナルハンドラについてはsignal関数を調べてください)。

> <符号無し整数型から符号付き整数型に変換する際、元の値が表現できなければ、>
> とは、具体的にどのような場合をいうのでしょうか?

例えば、

unsigned int a = UINT_MAX;
int b = (int)a;

とした場合、aの値はUINT_MAXであり、int型の表現範囲に収まりません。
具体的には、int型が32ビットで負値を2の補数で表現する処理系であれば、int型の表現範囲は-2147483648~+2147483647になりますから、UINT_MAXの値(4294967295)を表現することができません。

> <処理系定義の値になるか処理系定義...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報