- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語signed long long型の演算)
C言語signed long long型の演算に関する疑問
このQ&Aのポイント
- C言語でsigned long long型を使用して演算を行った場合に、期待した結果とならない問題が発生することがあります。
- 具体的には、変数bに格納される値が期待した値ではなく、異なる値になってしまいます。
- この問題は、変数の型宣言や32bitと64bitの環境での違いによって引き起こされます。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
unsigned int の 1 と int の -1 を掛けるので 1. int の -1 を unsigned int に変換する. その結果は 42.... 2. unsigned int の 1 と上で得られた値を掛ける. もちろん結果は 42.... んで, その結果を signed long long に入れるので (値が保存されて) 42.... ということでは.
お礼
早速の回答ありがとうございます。 「値が保存されて」とありますが、この場合、aの宣言をsigned intにした場合も同様の結果(4294967295)にならないのでしょうか? 計算式の右辺の処理手順を考えるとunsigned intの演算結果として4294967295になるのは分かるのですが、signed intの場合になぜ4バイト演算結果の値が保存されずに8バイト領域の先頭4バイトに0xFFFFFFFFが補完されてしまうのかの理由が分かりません・・・
補足
スミマセン、説明をよく読んだら解決しました。 1.の処理の時点で-1が型変換され4294967295になっているという点に気づきませんでした。 つまり、signed intで宣言した場合は、1.の変換は必要なくなり、2.でsigned intの1と-1を掛けて結果が-1となり、そのままsigned long longに格納・・・という手順になるわけですね。 ありがとうございました。