2006年01月03日

C言語: 符号ビットのシフトに失敗!

昔、ビットシフトの演算処理を行った際、ちょっとハマったことがある。

#include <stdio>
void main(void)
{
 short value1, value2;

 value1 = value2 = 0x8000;

 value1 >>= 1;
 value2 = value2 >> 1;

 printf("value1 = %x\n", (unsigned short)value1);
 printf("value2 = %x\n", (unsigned short)value2);
}

bit_shift_src.zip
bit_shift_exe.zip

上記のプログラムを実行した場合、

  value1 = 4000 
  value2 = 4000 


が出力されるものと思っていたが、
実際には以下のように出力された。
bit_shift_image.JPG


思惑としては「0x8000」の最上位1ビットが右シフトすることによって
0x4000」になるはずだった。

この不具合の原因としては、符号付シフトが行われたことによって、符号ビットがコピーされていたことが原因となる。

これは、ビット演算の処理において符号付の変数を使用していたという初歩ミスであり、変数の型を「short」から「unsigned short」に修正するだけで解決する。

同じケースに遭遇することは滅多に無いと思われるが、みなさんも気をつけよう!

それでは〜。


・・・もしよかったら、右上のバナー広告をクリックしてほしいな・・・。
・・・もしくは、人気blogランキング をクリックしてほしいな・・・。
 m(_ _)m
 
posted by かねやん at 02:00| Comment(4) | TrackBack(2) | C/C++言語 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
いつもお世話になっております。

トラックバックステーション管理人、tbstationと申します。

先月のおすすめblogに選ばせて頂いたため、ご連絡を差し上げました。

今後ともトラックバックステーションをどうぞよろしくお願い致します。
Posted by tbstation at 2006年01月07日 07:26
初めましてー。
トラックバックありがとうございますー。

そうですね、気をつけましょうね。アセンブラのシフト命令に落ちますので^^;
でもビットローテーションはCじゃだめですねー。結構欲しい機能ですが。
Posted by ある at 2006年01月13日 16:28
Hi, nice site! Visit my site http://freechuckecheese-coupon.blogspot.com http://baby-coupon.blogspot.com http://paypal-couponcode.blogspot.com http://kfc-coupon.blogspot.com http://turbotax-coupon.blogspot.com http://code-couponoverstock.blogspot.com http://code-couponsnapfish.blogspot.com http://jetblue-couponcode.blogspot.com http://staplesonline-coupon.blogspot.com http://childplaceprintable-coupon.blogspot.com http://bluecode-couponjet.blogspot.com http://code-coupontarget.blogspot.com http://firestone-coupon.blogspot.com http://turbotax-couponcode.blogspot.com http://code-couponproflowers.blogspot.com http://freelove-coupon.blogspot.com http://printablecigarette-coupon.blogspot.com http://gap-couponcode.blogspot.com http://love-coupon.blogspot.com http://carrentaldiscount-coupon.blogspot.com http://firestoneservice-coupon.blogspot.com http://papajohnspizza-coupon.blogspot.com http://freecigarette-coupon.blogspot.com http://code-couponstaple.blogspot.com http://code-couponjconlinepenney.blogspot.com http://carcode-couponrental.blogspot.com http://ladyfootlocker-coupon.blogspot.com http://travel-coupon.blogspot.com http://swiffer-coupon.blogspo.com http://code-coupondepotoffice.blogspot.com http://code-coupontaxturbo.blogspot.com http://freechuckecheese-coupon.blogspot.com http://baby-coupon.blogspot.com http://paypal-couponcode.blogspot.com http://kfc-coupon.blogspot.com http://turbotax-coupon.blogspot.com http://code-couponoverstock.blogspot.com http://code-couponsnapfish.blogspot.com http://jetblue-couponcode.blogspot.com http://staplesonline-coupon.blogspot.com http://childplaceprintable-coupon.blogspot.com http://code-couponsecretvictoria.blogspot.com http://hrblock-coupon.blogspot.com http://enterprisecarrental-coupon.blogspot.com http://victoriassecret-coupon.blogspot.com http://hobbylobby-coupon.blogspot.com
Posted by None at 2006年03月29日 09:16
ロレックス 中古 財布 男性 http://www.qunhqc.com/
Posted by 財布 男性 at 2013年08月11日 11:37
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:


この記事へのトラックバック

2005年12月のおすすめblog
Excerpt: 先月のおすすめblogは健康なエンジニアのブログさんに決定しました。 プログラミングのツボを、事例に基づき丁寧に解説している良いサイトです。
Weblog: トラックバックステーション
Tracked: 2006-01-07 07:26

ビットシフトの落とし穴 - 算術シフトと論理シフト
Excerpt: 「不定だ・・・。犀川創平君。君の方程式の解は、今や不定だ」 森博嗣 - 『笑わない数学者―MATHEMATICAL GOODBYE』 C言語には、ビットシフト演算子というものがあります。左..
Weblog: 職業としてのプログラミング
Tracked: 2006-01-09 02:30
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。