1、
今日のコードを理解するには少しの知識の埋蔵が必要です。
2、
タイトルと分析
いくつかの単語の男は、コードに言いました:
あなたは結果を何を作るのですか?
推定結果のほとんどは、友人に計算されている 2 。
予備分析
大体このコードを分析し、私たちは見てみましょう、コードは、知識が調べ二つの点で見つけることができます:
まず、データ型変換
第二優先課題演算子
この線の上、 - 最高の優先順位、第肯定をビット単位を行い、その後、+優先度の高い、SO 4 + 1 = 5の実装、及び最終的に右シフト演算を行います。
従って、上記のコードは、と等価です。
すなわち、まず、ビット単位の否定、~~ = 0xA5の(1010 0101B)= 0101 1010B = 0x5A
図5は、右を0x2を得ました。結果は2を計算していますか?
私たちが直接結果を確認するためのコードを実行してみましょう:
それはどのように?答えは250に急に等しい2、Bに期待されていません!これはなぜでしょうか?
暗黙的なデータ型変換と、整数の価値を高めます
さんが見つけ、このコード行以上詳しく見てみましょう、異なる種類の間に操作があったデータ型は、charで、データ型は、4と1を指定されていない場合、C言語のコンパイラはint型にそれをデフォルトになります:
私は、我々はすべて知っていると信じていた場合、C言語での動作中に文字データ型の両側に一貫性のない操作は、コンパイラがします、自動的に暗黙的なデータ型変換可能。
全体的に、このデータ型変換はより複雑であるが、一般的に、この原則に従ってください:データ精度の回避損失を
平均上記の原則は何ですか?
シンボル側のオペレータ一貫性のないデータ型ならば、コンパイラは常に、より広いデータ型を変換してみてください。
計算プロセスの数がfloatでない場合、彼らは確かに整数であり、コンパイラはint型にintデータ型のプロモーションの幅が、「として知られている現象よりも、すべての一般的に小さい値全体のアップグレード」
さらなる分析
私たちは、のは、再びコードの先頭行を見てみましょうアップグレードの全体の価値を知っています:
unsigned char型で、int型は、より少ないデータ幅よりもあるので、コンパイラは前にビット演算を実行するために、最初のデータ型intに増加します。
異なるマシン、int型の異なるデータ幅で、私のマシンのサイズにintが4バイトです。
したがって、データの型変換、= 0X 00 00 00 A5は 、 〜A = 0X FF FF FF 5(a)の後にビット単位であり 、 得られる、右ビット5(MSBが0オートコンプリート)を押し0x07のFF FF FAデータ・タイプがBチャーであるため、時間多重化に数値でbは、1バイトのみが、このように発生したデータの切り捨て、保存のみ最下位バイト、すなわち0xfa = 250。
概要
暗黙的なデータ型変換C言語が精通していない場合は、この問題によって、私たちは、見つけることができる、それがセットに簡単です。
また、演算子の優先順位は、提案は明らかにまだ括弧と実行の順序で、覚えるのが非常に困難です。
プログラミングを愛する人のために、小さな学習パートナーのグループと一緒にその答えは非常に重要です!私はプログラミングのゼロベースの交換クラブ(学ぶために始めているグループ)だけでなく、学習のビデオファイルを、歓迎初心者をしているし、少しの友人に前進します!