2017-05-04 9 views
2

私はJavaのプログラマで、バイトをstdoutに2種類印刷してみました。intを2バイトの配列にキャスト

unsigned char bytes[2]; 
//... 
printf("%x%x", bytes[0], bytes[1]); 
std::cout << bytes[0] << bytes[1]; 

しかし、これらの方法の出力は異なります。どうして? printf出力をstd::coutと同じようにするには?

+4

大文字と小文字の16進数(%x)を返します。 –

+0

'bytes'には何がありますか? –

答えて

3

std::coutで、それらは文字として印刷されます。 printf整数のプロモーションで

が発生し、彼らがint sと渡される、と%x指定子は16進形式でunsigned intを印刷するprintfに指示します。

あなたは%cを使って文字を印刷するprintfを得ることができるか、hexフラグを自分でプロモーションをやって設定することにより、六角として、それを印刷しstd::coutを取得することができます。

あなたのprintfの呼び出しは、下に印刷され
std::printf("%c%c", bytes[0], bytes[1]); 
std::cout << std::hex << +bytes[0] << +bytes[1]; 
1

%xはCSは、例えば、コード

int x = 80; 
printf("%x", x); 

50を印刷する16進数を出力します。

数字を10進数で書くには、%dを使用する必要があります。また、いない文字、数字の形でchar変数を印刷するには、あなたがintにキャストする必要があります。

unsigned char bytes[2]; 
//... 
printf("%d%d", bytes[0], bytes[1]); 
std::cout << (int)bytes[0] << (int)bytes[1]; 
+0

もう一度 –

+0

私のコンピュータでは、このコードは同じ行を印刷します(実際には1行に印刷されますが、いずれにしても同じです)。あなたのケースには何が印刷されていますか? – alexeykuzmin0

+0

@ St.Antario:配列には何が入っていますか? –

1

相当するものは次のようになります。

#include <iomanip> // needed for std::hex 

std::cout << std::hex << static_cast<unsigned int>(bytes[0]) << static_cast<unsigned int>(bytes[1]); 

2つの違い:

  • printf%xは16進数で表示されます.C++ストリームの場合、std::hex
  • です
  • あなたprintfは(%x用)int値がかかりますが、C++のストリームは、(代わりに、それは文字として印刷されます)整数値としてunsigned charを出力しますので、あなたがunsigned charをキャストする必要がoperator<<を持っていません最初に整数型(例えば、上記のコードのようにunsigned int
関連する問題