開発環境
- OS X Mavericks - Apple(OS)
- Emacs (CUI)、BBEdit - Bare Bones Software, Inc. (GUI) (Text Editor)
- C (プログラミング言語)
- Clang (コンパイラ)
C実践プログラミング 第3版 (Steve Oualline (著)、 望月 康司 (監訳) (翻訳)、谷口 功 (翻訳)、オライリー・ジャパン)のⅡ部(単純なプログラミング)の11章(ビット演算)、11.8(ビットマップグラフィックス)、設問11-2を解いてみる。
その他参考書籍
- プログラミング言語C 第2版 ANSI規格準拠 (B.W. カーニハン D.M. リッチー (著)、 石田 晴久 (翻訳)、共立出版)
- プログラミング言語Cアンサー・ブック 第2版 (クロビス・L.トンド、スコット・E.ギンペル(著)、矢吹 道郎(翻訳))
設問11-2.
2番目について、signed char型は1バイト(8ビット)なので、0x80はbinary 1000 0000。これを1だけ右シフトすると、符号ビットがセットされている(signed)のでbinary 1100 0000となる。よって動作しない。1番目は、short int型で、符号付きであることは2番目と変わらないけど、2バイト(16ビット)なので、0x80はbinary 0000 0000 1000 0000となり、符号ビットはセットされていないので、1だけ右シフトしても、0が詰められてbinary 0000 0000 0100となり、動作する。
2番目も動作するようにするには、符号ビットをセットしないように、singedではなくunsignedにすればいい。
修正。
コード
sample.c
#include <stdio.h> int main() { short int i; unsigned char ch; for (i = 0x80; i != 0; i = (i >> 1)){ printf("i is %x (%d)\n", i, i); } for (ch = 0x80; ch != 0; ch = (ch >> 1)){ printf("ch is %x (%d)\n", ch, ch); } return (0); }
makefile
CC=cc CFLAGS=-g sample: sample.c $(CC) $(CFLAGS) -o sample sample.c clean: rm -f sample
入出力結果(Terminal)
$ make cc -g -o sample sample.c $ ./sample i is 80 (128) i is 40 (64) i is 20 (32) i is 10 (16) i is 8 (8) i is 4 (4) i is 2 (2) i is 1 (1) ch is 80 (128) ch is 40 (64) ch is 20 (32) ch is 10 (16) ch is 8 (8) ch is 4 (4) ch is 2 (2) ch is 1 (1) $
0 コメント:
コメントを投稿