[H8-ML(6034)] Re: [H8-ML(6032)] Re:H8 32ビット変数の使い方について
From: "katsuragi" <katsuragi@xxxxxxxxxxxx>
Date: 2006年08月05日(土)00時01分25秒
 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に同様の記述がありますよ。

スレッド概略
[表示中](起点)
 └[6035(1)]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]