おいふぉりーのぶろぐ

きっと趣味のブログに違いないです!!

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

[C言語]変数の落とし穴

今日も朝っぱらから、CCS Cコンパイラでプログラミングをしていたわけですが、2つほどてこずりました。ここでは、その1つを紹介します。

これはCCS Cコンパイラに限ることではありませんが、ソフトウェアで量子化された値を扱うときの落とし穴って感じでしょうか。
まず、次のプログラムを見てください。
001 int main()
002 {
003 char x;
004
005 scanf("%d", &x);
006 if (x < 0) {
007 x = -x;
008 }
009 printf("x = %d\n", x);
010
011 return 0;
012 }

このプログラムは、char型の変数xに値を代入すると、その値の絶対値を表示します。当たり前ですね。ところが、実は入力値がある特定の値だと絶対値を表示しないのです。分かりますか?実は-128を入力すると結果は-128を出力してしまうのです。
なぜ、そのようになるのか順に考えてみましょう。char型は8ビットの符号付整数で-128~127の整数値を表すことができます。そもそも、-128の絶対値は128ですから、char型では正しい結果を求めることができませんよね。それでは、x = -x;について少し深く考えて見ましょう。これはx = ~x + 1;と同じことですよね?コンピュータの内部では、符号の反転は、元の数の補数に1を足すことにより実現できます。次に、x = -128のときについて考えて見ましょう。-128(10) = 10000000(2)ですから、~(-128) = 01111111(2)となり、~(-128) + 1 = 10000000(2) = -128(10)となります。このように、char型では-128の符号を正しく反転することはできません。
私は、このような感じに演算した結果を配列のインデックスとして用いたので、想像のとおり、すごいことになってしまいました。
  1. 2006/01/15(日) 18:29:30|
  2. ソフトウェア開発
  3. | トラックバック:0
  4. | コメント:0
<<[PICマイコン]CCS Cコンパイラの陰謀? | ホーム | [CCS C]ちょっと、てこずったこと。>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://tm86eublog.blog42.fc2.com/tb.php/21-f0172359
この記事にトラックバックする(FC2ブログユーザー)

来客数

プロフィール

Euphorie

Author:Euphorie
"おいふぉりー"って呼んでくださいな☆
ハードウェアとかソフトウェアとかの開発に興味があったり。。。
連絡先は上の画像。

最近の記事

最近のコメント

最近のトラックバック

月別アーカイブ

カテゴリー

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

RSSフィード

リンク

このブログをリンクに追加する

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。