0

私のマシンでは、次のプログラムが1234をその出力に書き込みます。

const char str[] = "1234";
printf("%c%c%c%c\n",
    (int) (0xff & (*(uint32_t*) str) >> 0),
    (int) (0xff & (*(uint32_t*) str) >> 8),
    (int) (0xff & (*(uint32_t*) str) >> 16),
    (int) (0xff & (*(uint32_t*) str) >> 24));

これは、strが内部的にとして表され0x34333231、最初のバイトstr[0]が最下位8ビットを表すことを意味します。

strこれは、リトルエンディアンでエンコードされていることを意味しますか?そして、このプログラムの出力はプラットフォームに依存しますか?

また、switch caseステートメントで1、2、4、および8文字の文字列リテラルを使用する便利な方法はありますか?*(const uint32_t* const) "1234"定数式ではないため、文字列を整数に変換する方法が見つかりません0x34333231。/0x31323334はプラットフォームに依存する可能性があり、16進数で表記する必要があります。

編集:

言い換えれば、は0xff & *(uint32_t*) str常にstr[0]

ええ、気にしないでください、それがそうだと気づいただけで、またその理由も。

4

3 に答える 3

4

文字列のエンディアン(ASCII文字列について話している限り存在しません)と整数のエンディアンを混同しています。システムの整数はリトルエンディアンです。

2番目の質問に答えるために、文字列をオンにすることはできません。速度の向上が本当に必要な場合は、リトルエンディアンシステム用とビッグエンディアンシステム用に1つずつ作成できます。

于 2012-09-28T14:25:45.220 に答える
2

エンディアンとは、大きい値のバイトの順序を指します。文字列は(少なくともCおよびC ++では)バイトの配列であるため、エンディアンは適用されません。

実際には、複数文字のリテラルを使用して最後の段落で述べたことを実行できますが、実装はそれがどのように機能するかを正確に定義し、文字列は。以下でなければなりませんsizeof(int)

C ++標準、§2.14.3/1-文字リテラル

(...)複数のc-charを含む通常の文字リテラルは、複数文字リテラルです。複数文字のリテラルには、int型と実装定義の値があります。

たとえば、は実装定義'abcd'の値を持つタイプの値です。intこの値は、おそらくエンディアンに依存します。整数なので、スイッチを入れることができます。

于 2012-09-28T14:37:37.400 に答える
1

バイトは、メモリアドレスが0x31、0x32、0x33、0x34のように増加するように配置されます。

32ビット整数はリトルエンディアンで、0x34333231になります。ビッグエンディアン0x31323334の場合。

(また、一般的に整数は偶数または4倍のアドレスに配置されます。)

于 2012-09-28T14:51:56.750 に答える