2017-01-03 14 views
6

GCCユーザーであることから、clangがuint24_tタイプをサポートしていることに気がつきました(とにかくstdint.hにあります)。clangのuint24_tはどのように機能しますか? clang/LLVM以外でも使用できますか?

どのように機能しますか?つまり、純粋に内部的に、言語拡張としてサポートされているのですか、C++クラスのように実装されていますか?3バイト以上の抽象化、16ビット値、別の8ビット値ですか?そして、GCCを使って、そのような実装を「ヤンク」して自分自身で使用することは可能でしょうか?

注:

  • 私は(もっと一般的にまたはuint_t<N>)近代的なC++でuint24_tのようなクラスを持っていますよ。私の代わりに自分自身を圧倒している。
  • s/uint/int/g;この質問が好きな場合はs/uint/int/g;とすることができます。
+0

私はx86-64で、打ち鳴らす3.9上です。 1、インクルードディレクトリを使ってグレープすると、ブーストの結果しか得られませんでした。あなたのシステムを報告してください。 – Downvoter

+0

@Downvoter:私はそれを実際に見ている(http://clang.llvm.org/doxygen/stdint_8h-source.html)。そして、それはあなたの恐ろしいニックネームのようなものです。 – einpoklum

答えて

3

これはポータブルでも標準でもありません。これはAVR(24ビットアドレスを持つ)とGCC has it for that architecture, too(GCC v4.7以降)にのみ存在します。

アーキテクチャがネイティブの24ビット整数をサポートしていない場合、そのアーキテクチャは定義されません。

あなたはClang's stdint.h header fileで見れば、あなたは内部__INT24_TYPE__シンボルが定義されている場合にのみ24ビット整数のtypedefが条件付きで含まれていることがわかります:

#ifdef __INT24_TYPE__ 
typedef __INT24_TYPE__ int24_t; 
typedef __UINT24_TYPE__ uint24_t; 
typedef int24_t int_least24_t; 
typedef uint24_t uint_least24_t; 
typedef int24_t int_fast24_t; 
typedef uint24_t uint_fast24_t; 
# define __int_least16_t int24_t 
# define __uint_least16_t uint24_t 
# define __int_least8_t int24_t 
# define __uint_least8_t uint24_t 
#endif /* __INT24_TYPE__ */ 
+0

24ビット整数がAVRのためにどのように "ネイティブ"であるかわからない、IIRC AVRは8ビットレジスタを持ち、24ビット算術はx86_64の__int128と同様に実装されている、いいえ? –

+0

実際にどのように@marcが実装されているのかはわかりませんが、AVRはアドレスに24ビットの値を使用するので、これらの値を表現する方法が必要です。レジスタはわずか8ビットなので、おそらく算術演算をシミュレートする必要があります。 –

関連する問題