風で飛んでいくチラ裏

気ままに雑記メモ書き殴り。古い記事は別blogからの引っ越しなのでレイアウトがアレです。

MPLAB C18 Compilerはデフォで整数昇格してくれないよ

はじめに

MPLAB C18 CompilerはマイコンのPIC18シリーズ向けのCコンパイラです。

unsigned short bit_ptn = 0x0000;
int i;

for(i = 0; i < 16; i++){
	bit_ptn |= 1 << i;
}

/* このときのbit_ptnの値は?? */

ループを抜けたときのbit_ptnの値は 0xFFFF になってて欲しいはずなんだけど、実際は 0x00FF。

コンパイラのマニュアルにも書いてあるけど、MPLAB C18 Compilerはデフォルトで最大オペランドサイズでしか遂行してくれないので、こんなことになる。

6行目の整数リテラル「1」が char として扱われるので、8bit以上のシフト演算の結果は全て0になる。

回避策は (unsigned short)1 として明示的に被演算子をキャストするか、コンパイラオプションを変更して、ISOと同じように全ての計算をint精度以上で遂行するように指示するか。

全計算をint精度以上で行うと、本来charの計算でいいところもintで計算することになって、命令数が増える → プログラムサイズが増える、実行時間が増えるということになるです。

(function(document){ var pres = document.getElementsByTagName("pre") for(var i=pres.length; i--; ){  var el = makeOl(pres[i]) pres[i].appendChild(el) } function makeOl(pre){ var ol = document.createElement("ol") , li = document.createElement("li") , df = document.createDocumentFragment() , br = pre.innerHTML.match(/\n/g) ol.className = "preLine" ol.setAttribute("role", "presentation") for(var i=br.length; i--; ){ var li2 = li.cloneNode(true) df.appendChild(li2) } ol.appendChild(df) return ol } })(document)