[H8-ML(372)] Re: 質問者:秋月Cコ ン広域変数の件
From: Osamu Imaizumi <imaizumi@xxxxxxxxx>
Date: 1999年10月09日(土)15時13分51秒
<199910090451.NAA56681@xxxxxxxxxxxxxx> の、
   "[H8-ML(371)] 質問者:秋月Cコ ン広域変数の件" において、
   "三上典秀 <robot@xxxxxxxxxxxx>"さんは書きました:

robot> 説明不足ですみません。以下問題のプログラムの一部を記入してみました。

  これは変数初期化の問題ではなくて符号拡張の問題ですね。
#要らん事を長々と書いてしまって申し訳ない。

robot> char data;   /* 入力データ格納変数 */
robot> char data2;   /* 入力データ格納変数2 */

Cの場合、原則として演算はintで行われるので後のような比較をするには
unsigned charでないと駄目です。
余談:Cが最初に作られたPDP11にはバイト長のレジスタ/演算命令が無か
ったという歴史的経緯によります。

robot>    switch ( data ){

ここでcharは符号付きなのでdataは符号拡張されます。ここでdata = 0xefなら0xffef。

robot>        case ~(0x10): Up();  break;   ←ここで~(0x10)を0xefに変えてみると
robot> 動かない

~0x10も符号拡張されるので0xefではなく0xffefです。0xefでは一致しません。

  これは何も秋月のCに限らない初歩の初歩です。特に必要でない限りcharではなく
unsigned charを使うことをお勧めします。
余談2:大半のCでchar がsignedなのはPDP11の機械命令には当初、符号無し整数と
いう型が無かったという歴史的経緯によります。最近のCではコンパイラオプショ
ンひとつでcharをunsigned charとして扱えるものも多いのですが、そうなると今
度は符号付きをsigned charと書かないとbugになるので良く理解してない人は避け
た方が無難でしょう。

#組み込み用途でPDP11のCのスタートアップとランタイム書いた事もあったりします。
#今考えるとあれがもっとも短時間でCを理解する役に立ったのかも。
#当時はアセンブラ全盛だったので白眼視されましたけど^-^;

PS.本来は符号付きcharとして使いたいというのであれば
switch((unsigned char) data)
とキャストして使うという手もあります。

//imaizumi aka gigo


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


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


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