2017-01-21 8 views
-3

編集:私はプリプロセッサでsizeof()を使用できないことを知っています。私は自分のコードを修正したいと考えています。Cプリプロセッサを使用して、可変サイズの(オペレーティングシステムに依存する)16進リテラルを生成するにはどうすればよいですか?

Iは、(タイプunsigned intの変数内に格納されている)16進数の値を使用するCコードを持って:オペレーティング・システムはunsigned intを表現することを決定する方法に応じて

0x0000'0000'0000'0001 (64-bit/8 Byte system, 15 0's) 
    0x0000'0001   (32-bit/4 Byte system, 7 0's) 
    0x0001    (16-bit/2 Byte system, 3 0's) 
    0x01     (8-bit /1 Byte system, 1 0's) 

を(私が最もOSドンことを認識よそれらを64'bの値として表していますが、私には負担があります)。私は上記の4つの16進数のいずれかをとるオブジェクトマクロを生成したいと思います。これは、OSがどのように実装するかによって異なります。unsigned int

#define SYS_UINT_TYPE sizeof(unsigned int) 
    #if SYS_UINT_TYPE == 8 
      #define DEFAULT_MASK 0x0000000000000001 
    #elif SYS_UINT_TYPE == 4 
      #define DEFAULT_MASK 0x00000001 
    ... 
    #endif 

しかし##(C連結演算子を使用する方法がある場合、私は思っていた:これを行うには

簡単な(デッド数える)の方法は、if-else文のシリーズを使用することです)正しい0を連結して正しいDEFAULT_MASKマクロ展開値を生成します。私はBバイトシステムの場合、テキストリテラル0xと連結する必要がある0の数は2B-1ですが、For-loopプリプロセッサディレクティブのようなものではありません。

実際には、これは入力する必要がある#if ... #elif ... #endifのサイズを縮小するために機能します。

+3

リテラルを符号なしのintとして宣言し、その値に '1'の値を割り当てます(その前に' 0x'は必要ありません)。 Voila!完了しました。これは、コンパイルしたすべてのプラットフォーム上のunsigned intに適したサイズになります。視覚の中に一つの '#if'もありません。 –

+0

それはうまくいく、ケン。ありがとう。 可能であれば、一連のプリプロセッサ連結を実行する方法を尋ねることは、この質問の範囲に含まれていますか? –

+0

*この質問の範囲*?いいえ、これはこれとは無関係の全く別の質問です。最初にここで検索して以前に尋ねられているかどうかを調べます(それが疑わしいので、徹底的に検索します)。新しい質問を作成してそこに質問していない場合は検索してください。 –

答えて

0

umこれらはすべて0x01ですか?彼らがintに収まる場合、彼らは大きさのint型になりますので、彼らはマスクがLSB LSBに並んされます行われているとき...

がでこれのあなたの自己を説得...

リテラルです:

printf("%lld",(long long) 0x01 | (long) 0x01 | (int) 0x01 | (short) 0x01 | (char) 0x01);

これは、最上位ビットに並んでいる場合、それはのようなものになってしまうでしょう:

0x01 00 00 00 00 00 00 00 
      0x 01 00 00 00 
      0x 01 00 00 00 
       0x 00 01 00 
        0x 01 
------------------------- all of this | or'd together 
0x01 00 00 00 01 00 01 01 

ではなく、それはジュースです(0x01)。

これのすべては小さいサイズが大きくなるストレージサイズが同じ値になるようにパディングされた整数プロモーションのマジックを通じて起こる...

事が部分的に...署名値とネガとメシエを取得整数昇格の規則はより複雑であるためです。

+2

ありがとうございます。私は、問題を解決するために解決策を過度に複雑化したケースだと思います(ケンホワイトが指摘したように)。それらの "奇妙な"瞬間の一つ。 –

関連する問題