2017-02-09 9 views
2

ソケットからデータを受信して​​います。
その後、受信したchar配列に1バイトを出力します。タイプキャスト後に1バイトを出力して

以下

は、私が使用するコードです:

char buf[100];                 
int i = 0;                  
while (1)                  
{                    
    rc = recv(socket_fd, buf, sizeof(buf), 0);         

    if (rc > 0)                 
    {                   
     printf("Pos1 = %x.\n", (char)buf[17]); 
     printf("Pos2 = %x.\n", (char)buf[22]); 
    }  
} 

しかし、これは4バイトを出力します。文字をの符号なしの文字にタイプキャストすると、1バイトが出力されます。では、これら2つのタイプキャストの違いは何ですか。つまり、印刷されるバイト数が異なります。

出力:

Pos1 = 1 

Pos2 = ffffff83 
+0

なぜあなたは '%x'を使用していますか? 16進値が必要ですか? – Jarvis

+0

はい。値を16進数で表示したい。 –

+0

あなたの出力を共有してください。それが4バイトを印刷しているとはどのように判断しましたか? –

答えて

1

あなただけの2ニブルを印刷したい場合は、以下を使用します。いくつかのシステムでは

printf("Pos1 = %02x.\n", (unsigned)(unsigned char)buf[17]); 
/*    ^^       */ 
/* Print 2 nibbles with 0 prefix if required */ 

は、charsigned charとして振る舞うことが、あなたはffを表示するために先頭に付加見るでしょう負の数。したがって、そのようなシステムでbuf[i]unsigned charにキャストする必要があります。第二に、符号なしが

printfのためにあなたがC stdioのLIBの参照に行けば指定%x

Working example

+0

私はそれを試みましたが、結果は同じです。それは4バイトも印刷しています。 –

+0

申し訳ありませんキャスティングを盲目的にコピーしました。 'unsigned char'にキャストしてください。 –

+0

はい。これはffffffが前に付いています。私の出力はPos2 = ffffff83のようです。 –

1

と引数の型を一致させるために使用され指定子「X」を符号なし進整数を出力します。

まず、print関数は整数値が必要です。

この例では、符号付きの文字にキャストしています。

変数を符号付きcharにキャストし、その値が127(0X7F)を超えると、設定された符号付きビットが4バイト整数エンティティに拡張されます。一方、値が正(0〜127)の場合、出力(符号なしのint値)は符号なしのcharキャストと同じになります。

たとえば、 の文字としてキャストした場合、128(0x80)がFFFFFF80として表示され、符号なしの文字としてキャストされたときに80が表示されます。一方、いずれかのキャストで7Fとして表示されます。

したがって、printfを使用する場合、印刷する変数タイプは指定子タイプと一致する必要があります。

1

この2つのタイプキャストの違いは、バイト数が異なることです。

printf機能に渡された各入力引数をスタックにプッシュされる前に、4または8バイト(そのタイプに応じて)に「拡張」されます。

タイプがsignedの入力引数を渡すと、符号ビットは「保存」されます。

たとえば、signed char 0x89は、signed int 0xFFFFFF89に拡張されています。

unsigned char 0x89unsigned int 0x00000089に拡張されています。


上記の回答はプラットフォームによって異なりますのでご注意ください。私はあなたのプラットフォーム上で想定しました

  • CHAR_BITは8
  • sizeof intでは4
  • sizeof doubleあるprintf入力引数に関してで8

私の知る限りである:

    よりも小さい
  • 整数引数はdoubleよりも小さい非整数引数がdouble
0

あなたが

を行うことによって unsigned intの半分の半分に渡している printfを伝えるために拡張され int
  • に拡張されます
    printf("Pos1 = %hhx.\n", (unsigned char) buf[17]); 
    
  • 関連する問題