トップ «前の日記(2007年01月29日) 最新 次の日記(2007年01月31日)» 編集
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|10|12|
2009|02|03|06|07|10|11|12|
2010|01|02|03|04|07|09|10|11|12|
2011|01|03|04|05|06|07|08|10|
2012|01|06|08|09|10|12|
2013|01|02|03|04|07|09|11|12|
2014|01|03|04|05|06|09|
2015|04|
2016|01|08|
ここは旧えびめもです。えびめも2に移行します(2016/12/1)

2007年01月30日

C言語トリビア

C言語の左シフト演算子 << のオペランドに負が使えるのだろうか?
すなわちこういうことだ。
  8<<-1
実際にやってみた。
int main(){
        printf("%d\n", 8<<-1);
}
コンパイル&実行(i386 PC)
$ gcc -O2 test2.c
test2.c: In function `main':
test2.c:2: warning: left shift count is negative
$ ./a.out
0
コンパイラはワーニングを吐いた。結果はゼロになった。sh3でもやってみた。
$ gcc -O2 test2.c
test2.c: In function `main':
test2.c:2: warning: left shift count is negative
$ ./a.out
4
正しい値?になった。該当部分の逆アセンブル
   2:   ff e1           mov     #-1,r1
   4:   08 e5           mov     #8,r5
   6:   1d 45           shld    r1,r5
なるほど。プロセッサ任せてことね。
結論。やらないほうがいい