1

のような unsigned char 配列がありData[2]ます。unsigned int を返す関数の出力と比較するために必要でした。

Data[2]を unsigned int に、またはその逆にキャストしようとしました。うまくいきませんでした。

私がやろうとしていることは次のとおりです。

if (Data[2] == ReadFlash2(40))
{
    //Do Something.
}

ReadFlash2は unsigned int を返す関数ですData[2]が、 は unsigned char です。

それぞれキャストしようとしましたが、うまくいきませんでした。

私が間違っていることはありますか?どれをキャストし、何にキャストすればよいですか?

ありがとう。

編集: Readflash 関数のコード:

unsigned int ReadFlash2(unsigned int Addr) // use as Read Function 
{
pMem = (unsigned int*)MEM_STR_ADR; 
pMem += Addr; 
Nop(); 
return(*pMem); 
}
4

2 に答える 2

3

それらをキャストする必要はまったくありません。暗黙の昇格に関連する C のルールがそれを処理する必要があります。

つまり、 と を比較するunsigned charと、unsigned int最初unsigned charに が互換性を持つようになり、次に比較が行われます。

それはすべてC99でカバーされて6.3.1.8 Usual arithmetic conversionsいます(浮動小数点型について議論した後):

それ以外の場合、両方のオペランドで整数昇格が実行されます。

次に、プロモートされたオペランドに次の規則が適用されます。

両方のオペランドが同じ型の場合、それ以上の変換は必要ありません。

それ以外の場合、両方のオペランドが符号付き整数型であるか、または両方が符号なし整数型である場合、整数変換ランクが小さい型のオペランドは、ランクが大きいオペランドの型に変換されます。

...などですが、上記の最後の段落が該当します。

タイプがあなたが述べたとおりであり、Data[2]実際に から返されたもの同じ値である場合、少なくとも標準によれば、それは C 環境ではありませReadFlash2(40)

于 2013-06-19T03:15:57.640 に答える
1

マイクロコントローラーの揮発性メモリにアクセスしているようで、デバッグ時に混乱を招く可能性があります。比較の前にData[2]andを変数に格納してみてください。ReadFlash(40)

unsigned char data_2 = Data[2];
unsigned int readflash2_40 = ReadFlash2(40);

if (data_2 == readflash2_40)
{
    //Do Something.
}

これで、変数の値を調べることで、比較されている実際の値を調べることができるはずです。

于 2013-06-19T04:01:54.337 に答える