1

この質問は何度も聞かれたと思いますが、具体的な答えはないと思います。あるとしたら見つからないので、できれば教えてください。

とにかく、C はバイト/ワード/ダブルワードを特定の表現に抽象化する方法をサポートしていますか?

浮動小数点と倍精度浮動小数点はコア機能のように見えますが、実際には新しいデータ型ではなく、既存の dword/qword の再表現です。

だから、私は、このようなことをすることはまったく可能であるのだろうか.

例えば。

mydatatype a = 0xff;

バイナリ形式で 0x00 として表されます。

C++ は = とクラスをオーバーロードしてこれを修正しようとするため、質問しますが、私が望むよりも少し抽象化を行います。

memcpy(&my_int, &my_float, 4);

次に、ビット単位の操作でintをいじって、それを元に戻すことができます

memcpy(&my_float, &my_int, 4);

一方、float がクラスとして定義されている場合、この低レベルの操作を実行できるとは確信していません。代わりに、クラスメソッド以外のすべての処理方法を完全に抽象化します。

興味深いのは、これが C 言語の機能ではない場合、float と double を含めることの理論的根拠に完全に適合しているように見えるのですが、複雑な数を作成することはできません。 float および double としての c 言語。

これはかなり長い間私を悩ませてきました。主な理由は、データ型を作成したいと思うとすぐに、不要と思われる void ポインター、構造体、異種データ型の領域に移行し始めるからです。

例: void *my_data_type = my_data_type_new(0xff); これは、0xff を 0 に「否定」し、my_data_type が指すメモリに格納します。

私が欲しいのは negchar my_data_type = 0xff; だけなので、これは不要のようです。

コンパイラがなんとか認識できるもの。

そして、私はできました

memcpy(&my_char, &negchar, 1);

my_char は 0 になります。

上記はC++クラスでは当てはまりません...

float、double は、ABI を維持しながら独自の方法で動作するという意味で抽象的ですが、特定の ABI を使用して複素数を表すこともできるため、実際には複素数と大差ありません。

つまり、typedef を作成せずに long long long を宣言することさえできないと思います (できますか?)。

これを実際の質問にするために、回答を次のように絞り込みます。この機能は C で使用できますか? もしそうなら、どうすればこれを行うことができますか? そうでない場合、そのような機能が考慮されたことはありますか?そうでない場合は、この抽象的な機能をコア機能にした実数表現の歴史的な必要性により、float、double が特別であるという理由だけでしょうか?

つまり、Fortran のような言語がデフォルトで実数をサポートしていることは理解していますが、C はこの機能を「コア機能」から外して、プログラマーが必要なく抽象的な ABI 型を作成できるようにすることができると思います。解放する必要があるメモリ ブロックへのポインターに頼り、解放中のより強力な型チェックを可能にします。

特に、私の知る限り、完全に抽象化された抽象静的データ構造が float と double だけであることは非常に奇妙です。他のすべてのプラクティスは動的メモリで遊ぶか、表記の乱用を許可します(charを使用しますが、関数でのみ変更します)。

結論: C++11 はこれをサポートしているように見えますが、C に新しいデータ型を追加することは非常に混乱を招きます。プログラミングでは実数表現が自然に要求されるため、float と double が必要です。この機能は抽象データ型を介して実装できますが、それらを言語コアの一部にすることは、当時は理にかなっています。

ありがとう!〜ドミトリー

4

1 に答える 1

2

C コア言語には、標準で提供されている以外の方法でリテラルを再解釈する手段はありません。

一方、C++11 ではユーザー定義のリテラルが導入され、意味のある記述が可能になります。

negbyte operator "" _nb(unsigned long long);

negbyte val = 0xff_nb;
于 2013-04-04T03:56:05.890 に答える