16

unsigned char値を2桁の16進値として出力しようとしていますが、結果は常に4桁の16進値として取得され、コードの何が問題になっているのかわかりません。

// unsigned char declaration
unsigned char status = 0x00;
// printing out the value 
printf("status = (0x%02X)\n\r", (status |= 0xC0));

として2桁の16進数の結果を期待しています0xC0が、常に。を取得し0xC0FFます。

同様に、unsigned charと同じ変数(ステータス)を%buフォーマット識別子で出力しようとすると、出力は。になりました255

2つの16進文字だけを出力として取得するにはどうすればよいですか?

4

4 に答える 4

29

私の知る限り、KeilCコンパイラはC標準に完全には準拠していません。もしそうなら、char可変個引数関数に値を渡すなどの標準的なプロモーションルールに完全には準拠していない可能性があります。8ビットCPUでは、8ビット値を16ビット以上に自動的に拡張しないというパフォーマンス上の利点があります。

回避策として、引数をに渡す前に上位ビットを明示的に切り捨てることができますprintf。これを試して:

#include <stdio.h>

int main(void) {
    unsigned char status = 0x00;
    status |= 0xC0;

    printf("status = 0x%02X\n", (unsigned int)(status & 0xFF));
    return 0;
}

でビット単位の「and」を実行すると0xFF、下位8ビットを除くすべてがクリアされます。toをキャストするunsigned int 必要はありませんが、引数が実際にフォーマットで期待されるタイプであることを保証しprintfます"%02X"

タイププロモーションおよびの非標準の動作については、実装のドキュメントも参照してくださいprintf

于 2012-09-10T03:13:57.267 に答える
7

intを期待するフォーマット文字列にcharを送信しています。printf関数は、スタックから別のバイトを取得して埋めます。試す

 printf("%02X",(int)(status|0xC0));
于 2012-09-10T02:49:15.367 に答える
4

すべての答えを見ると、おそらくこれを行う別の方法が欠けていると思います。

const unsigned char chararr[]="abceXYZ";
for (int i=0; i< 7; ++i) {
    printf("%#04X %d %c\n", chararr[i], chararr[i], chararr[i]);
}
0X61 97 a
0X62 98 b
0X63 99 c
0X65 101 e
0X58 88 X
0X59 89 Y
0X5A 90 Z

%#04x small xを使用すると、出力はb 0xsmallxプレフィックスになります。#ポンド記号は、0xを出力するように関数に指示します。04は出力する桁数を指示します。入力が「0x0a」の場合はこれを出力し、04がない場合は「0xa」を出力します。

私のコンピュータであるDellワークステーションでは、出力は質問で期待どおりです。そうでもなければ

unsigned char status = 0x00;
printf("status = (0x%02X)\n\r", (status |= 0xC0));
// output
//status = (0xC0)
// is exactly expected by the original question. 

例でよりよく説明されています:

 37    printf("status = (%#02x)\n", (status |= 0xC0));
 38    printf("status = (%#04x)\n", (status |= 0xC0));
 39    printf("status = (%#04x)\n", 0x0f);
 40    printf("status = (%#02x)\n", 0x0f);
status = (0xc0)
status = (0xc0)
status = (0x0f)
status = (0xf)
于 2019-01-20T18:34:15.753 に答える
1

unsigned charにキャストします:

printf("status = (0x%02X)\n\r", (unsigned char)(status |= 0xC0));
于 2012-09-10T02:49:22.297 に答える