上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
--.--.-- -- l スポンサー広告 l top
実はC言語は90年にISO規格化されたのですが、99年に一度大幅な改定を行っています。

しかし現在出回っている書籍やネットでもこの99年までに書かれた内容を使っている場合や、作者自身が99年以前のC言語を学んでいた場合が多いので、C言語を勉強した人でも本当に便利な機能のいくつかを知らないということがあります。

そこでプログラミング言語 C の新機能からいくつか便利な機能を抜き出して紹介したいと思います。


○複素数が使えるようになった
_Complex,_Imaginaryと表記することで複素数が扱えるようになった。#include とすることで、complex, imaginary, I といったシンボルが使用可能になる。(double complex)(1.2 + I * 5.4); のような複素数の表記、演算などが可能。

○boolean型が使えるようになった
値0か1を保持できる型。#include することでシンボル bool, true, false が使えるようになる。

○64bitの整数型long long intが登場
実行するにはstdint.hのincludeが必要?

○可変長配列が可能に
配列の個数が実行段階にならないとわからない!
ってことになっても大丈夫になりました。
mallocで確保すればいいじゃん!っていうひともいるけどメモリ開放忘れるでしょ?後処理が遅いんだよ。

○負の数の除算の定義化
結果はすべて0方向に切り捨てられます
つまり-3÷2の場合本当の商は-1.5だけれども0方向に切り捨てられるので商は-1になります
あまりは「割られる数-割る数×商」が適用されるので今回は[-3-(-1*2)]が適用されて-1になります


どうでしょうか?今まで勉強してきた中で意外に見たことが無かった仕様が入っていたりしなかったでしょうか?




以下教えてGOOなどからlong long intに関する引用

★アドバイス
・C99 の規格上では long long 型が『%lld』で unsigned long long 型が『%llu』です。
 でもコンパイラによっては利用できなかったり、『%I64d』、『%I64u』で同等の機能を
 用意していることがあります。
・VC++2003.NET では『%lld』、『%llu』は使えないようです。
 その代わりに『%I64d』、『%I64u』、『%I64o』、『%I64x』などが用意されています。
 『I64』が 64 ビットを表しているようで他にも『I32』の 32 ビット版もあります。
・使用例としては
 unsigned long long a = 0x0123456789ABCDEF;
 
 printf( "a = %I64u\n", a );
 printf( "a = 0x%016I64X\n", a );
 ↑
 こんな感じになります。
・使っているコンパイラが分からないため参考程度にして下さい。
・以上。


★C99 の規格上では 64 ビット整数があります。
・でも処理系(コンパイラ)によって利用可能、不可能があります。
 例えば VC6 は使用不可能、VC++2003 から使用可能。
 VC++2003、VC++2005 の両方で『long long』型は利用できますが printf などの
 書式指定の文字列が異なります。VC++2003 では『%I64d』『%I64u』ですが
 VC++2005 では『%lld』『%llu』となります。
・また VC 系には次の型が用意されています。
 『__int64』
 『LONGLONG』『ULONGLONG』『DWORDLONG』
 『LARGE_INTEGER』
 どれも 64 ビットを扱う型のようです。
・Windows 環境によってはサポートされていない VC6 でも『LONGLONG』『ULONGLONG』
 などの型が擬似的に利用できるようです。多分は 64 ビット整数の演算をエミュレート
 しているものと推測します。なので正式な 64 ビット整数『long long』型よりも演算が
 低速です。
・まずは処理系(コンパイラの種類)を確認して下さい。
 過去に似たような質問がありましたので参考にして下さい。
 ​http://oshiete1.goo.ne.jp/qa2739902.html​→『VC6でlong longでエラー?』
 ​http://oshiete1.goo.ne.jp/qa3111328.html​→『unsigned long long 型のフォーマット指定子』
・以上。


★『64Bit』の整数について
・『Java』言語では 64 ビット整数を正式にサポートしていますが、C 言語では処理系依存になります。
・『VC6』にはあまり詳しくありませんが、『long long』はマイクロソフト社系では使えません。
 その代わりに、妙な型が定義されていて『__int64』、『LONGLONG』、『LARGE_INTEGER』など3つほど
 64ビット整数を扱うような型が存在します。

●LARGE_INTEGER 共用体
typedef union union {
 struct {
  DWORD LowPart; // 飼い32ビット整数(符号なし)
  LONG HighPart; // 上位32ビット整数(符号付き)
 };
 LONGLONG QuadPart; // 64ビット整数(符号付き)
} LARGE_INTEGER, *PLARGE_INTEGER;

●関数
LONGLONG Int32x32To64( LONG a, LONG b ); // 掛け算(a×b=64ビットの符号付き整数を返す)
ULONGLONG UInt32x32To64( DWORD a, DWORD b ); // 掛け算(a×b=64ビットの符号なし整数を返す)
ULONGLONG Int64ShllMod32( ULONGLONG a, DWORD shift ); // 論理左シフト(a << shift の符号なし整数を返す)
ULONGLONG Int64ShrlMod32( ULONGLONG a, DWORD shift ); // 論理右シフト(a >> shift の符号なし整数を返す)
LONGLONG Int64ShraMod32( ULONGLONG a, DWORD shift ); // 算術右シフト(a >> shift の符号付き整数を返す)


最後に:
・詳しい関数の内容は、MSDN のマニュアルを見て下さい。
・また、上記で紹介した共用体と関数は『Microsoft Visual Studio .NET 2003 C/C++』です。
・最初に紹介した『__int64』は『_』『_』『int64』です。『_』が2つ先頭に付きます。
・以上。おわり。
2007.10.08 Mon l 完全な私事 l コメント (0) トラックバック (0) l top

コメント

コメントの投稿












トラックバック

トラックバック URL
http://omine3.blog119.fc2.com/tb.php/24-29fc3a19
この記事にトラックバックする(FC2ブログユーザー)
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。