2017-06-12 5 views
2
#include <iostream> 
using namespace std; 

int main(){ 
    int x = 0x414243; 
    cout.write((char*)&x, 1); 
    cout.write(((char*)&x) + 1, 2); 
} 

出力は次のとおりです。char *はこの整数を16進数でどのように読み取るのですか? ostream :: write()でどのように動作していますか?

CBA

私は(のchar *)&は、xとやっていることを理解していません。

このASCIIテーブルを見るとhttp://www.asciitable.com/と書いてありますが、私はwrite()が141,142,143を8進数で書いているようです。

char *はこれをどうやって管理していますか?

+0

https://stackoverflow.com/questions/22030657/little-endian-vs-big-endianの重複はありますか? –

+0

'(char *)&x'はまずx('&x')のメモリ位置をとり、それをcharポインタ '(char *)(&x)'としてキャストします。 –

+0

@FrançoisAndrieux 'endianness'これと関係がありません。 – Alberto

答えて

4

大文字のASCIIコード'C','B'、および'A'は、それぞれ67,66、および65、つまり0x43,0x42、および0x41です。

お使いのコンピュータは、32ビットlittle-endianがあるように見えますので、0x00414243のオクテット以下のようにメモリに配置されている(2つの余分なゼロは、32ビットintが完了するまでに、明確にするためです):

0x43, 0x42, 0x41, 0x00 

これをnullで終了する文字列"CBA"を表します。ビッグエンディアンのハードウェア上のオクテットが逆の順序で配置されること

ノート、すなわち

0x00, 0x41, 0x42, 0x43 

のでヌルで終了する文字列として、この番号を解釈することは、空の出力を生成します。

+0

私は実際にASCIIテーブルを間違って読んで、小文字の 'c'、 'b'、 'a' XDのコードを見ました – Alberto

0

プラットフォーム上の整数型は、おそらく2バイト以上です。charです。

長さがcharであるため、最下位バイト(a.k.a.リトルエンディアン)または最上位バイト(ビッグエンディアン)の順に並べ替えることができます。

(char *) xは、整数の最初の文字へのポインタです。

したがって、プラットフォームのバイト順序に応じて、0x00または0x43になります(xの長さが4バイトであると仮定します)。

関連する問題