1

4 バイトを 1 つの unsigned long 変数に正しく変換するにはどうすればよいですか?

MPLAB C18 で PIC18 をプログラミングしています。これが私のコードです。

unsigned long theseconds = 0x00;
BYTE timeToSave[4];

timeToSave[0] = 0xFF;
timeToSave[1] = 0xFF;
timeToSave[2] = 0x01;
timeToSave[3] = 0x01;

theseconds  =   timeToSave[0] & 0xFF;
theseconds |=  (timeToSave[1] << 8) & 0xFFFF;
theseconds |=  (timeToSave[2] << 16) & 0xFFFFFF;
theseconds |=  (timeToSave[3] << 24) & 0xFFFFFFFF;
printf("\r\nSeconds:%lu",theseconds);

これは私が取得し続ける出力です。 秒:255

ありがとう!

4

1 に答える 1

3

これはうまくいくはずです

unsigned long theseconds = 0x00;
BYTE timeToSave[4];

timeToSave[0] = 0xFF;
timeToSave[1] = 0xFF;
timeToSave[2] = 0x01;
timeToSave[3] = 0x01;

theseconds  =   timeToSave[3];
theseconds  <<= 8;
theseconds  |=   timeToSave[2];
theseconds  <<= 8;
theseconds  |=   timeToSave[1];
theseconds  <<= 8;
theseconds  |=   timeToSave[0];
printf("\r\nSeconds:%lu",theseconds);

あなたのコードは 2 つの理由で失敗します。
ANSI -C の規則では、 of (実際には符号なし char) を int に展開する必要があるintため、16 ビットまたは 24 のシフトは 0 になります。 明らかに、16 ビット値を 15 回以上シフトすると、結果も 0 になります。 BYTEtimeToSave[x]

しかし、なぜ 65535 ではなく 255 になるのでしょうか?
コンパイラは ANSI に準拠しておらず、unsigned char を適切な方法で展開しないと思います。

コードを機能させるには、各行をキャストするだけで十分です。

theseconds  =   timeToSave[0];
theseconds |=  ((unsigned long)timeToSave[1] << 8);
theseconds |=  ((unsigned long)timeToSave[2] << 16);
theseconds |=  ((unsigned long)timeToSave[3] << 24);

&値が範囲外になることはできないため、マスクはナンセンスです

于 2013-07-15T19:35:44.750 に答える