katsuragiです。 以下、気になった発言にコメントします。 > つまり、8bitで定義したデータを8bit以上シフトするとデータは0になります。 これは誤りですね! 算術変換規則がありますから、intサイズまでは問題ありません。 > sprintf( buffer, "UL=0x%08lx UI=0x%08x\n", uLData, uIData ); sprintf( buffer, "UL=%#08lx UI=%#08x\n", uLData, uIData ); の方がカッコ良いのでは? 0xの表示はタグ文字「#」で代用できます。 > uLData = Data[3]*0x1000000 + Data[2]*0x10000 + Data[1]*0x100 + Data[0]; > //bad > > uLData = Data[3]*0x1000000 | Data[2]*0x10000 | Data[1]*0x100 | Data[0]; > //good ビットごとの論理演算の方は//goodなのではなく、「たまたま」です。 Data[1]*0x100の部分はint型(0xFF00)であり、これが手前のData[3]*0x1000000 | Data[2]*0x10000の部分のlong型に引きずられてlong型に拡張され、0xFFFFFF00となるからです。 結果、両者は 0xFF000000 + 0x00FF0000 + 0xFFFFFF00 + 0x000000FF 0xFF000000 | 0x00FF0000 | 0xFFFFFF00 | 0x000000FF となっています。つまり、//goodは誤りで//badです。 > 日立のコンパイラをちょっと見たけど、それらしい記述は見つかりませんでした。 MISRA-C対策だと思うのですが、今だとtypedefine.hに同様の記述がありますよ。