charタイプデータの右シフト時のシンボルビット問題

1261 ワード

まず運転環境は51単片機+KEIL C
最近1つの16進数のデータを書いてASCII形式の関数に変換して、何度も実行して発見を発見して、16進数のデータの高い4ビットが8より大きい時、変換は
エラー.
最初にエラーが発生したプログラムは次のとおりです.
void hex2ascii(char hex, char ascii[])
{
	char i = 0;
	
	ascii[0] = (hex & 0xf0) >> 4;
	ascii[1] = hex & 0x0f;
	
	sendNChar(ascii, 2);
	
	for (i=0; i<=1; i++)
	{
		if (ascii[i] >= 0xa)
		{
			ascii[i] = ascii[i] - 0xa + 'A';
		}
		else
		{
			ascii[i] = ascii[i] + '0';
		}
	}
	
	sendNChar(ascii, 2);
}

KEIL C 51環境では、0 xe 3を入力し、fe 03 2 e 33を出力する.
VC環境では、出力入力0 xe 3、出力e 3 45 33
その後、何度も試みを修正し、原因を分析した.やっと原因を発見した:hexはcharタイプで、記号型があり、左の補記号ビット1をシフトした.
従って、feが得られ、ascii[0]=0 xfeは負数であり、0 xa未満であるため、結果=0 xfe+'0'=0 x 2 e(オーバーフロー後の結果)となる.
しかし違います、VCの上で運行するのは正常で、更に分析します
VCではint型が32ビットを占める
C言語による自動型変換の原理
Hex&0 xf 0、それぞれcharとconst intタイプ、int型0 xffffffffe 3&0 x 00000 f 0=0 x 00000 e 0に変換
どうやら、VC上の演算シフト時に左が0、KEIL C 51上の演算シフト時に左が1.
	int debug = 0;
	debug = hex & 0xf0;
	sendNChar(&debug, 2);

KEIL C 51下出力ff e 0 VC下出力e 0
ここを見つけてプログラムエラーの原因を知ったが、hex&0 xf 0処理の原因はまだ分からない.
まず私の51プログラムを断続的に調整します.
こんなところはこれからunsigned charタイプを使うので、不要なトラブルを避けることができます!