• ベストアンサー

C# uint += long

C# uint += long こんにちは、 C#なのですが、 uint a=0xffff0000; long b=-100; である場合、 a+=b; とするとエラーになります。 オーバーフローは考えないとして、この計算を行うにはどうすればよいのでしょうか? ifで切り分けるか、64bitで計算するしかないのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

オーバーフローを考えないでよいなら a+=(uint)b; として下さい。 期待した結果になります。

titokani
質問者

お礼

動作は確認しました。ありがとうございます。 負の値を符号なしの型にキャストした際の動作についての規格に関して、良い資料はありますでしょうか?

その他の回答 (4)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

理想論を未確認で続けると, ISO にあるなら JIS にあるかもしれない.

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

理想論としては, ISO なり ECMA なりの規格を読んでください. 実際には, Microsoft が勝手に拡張している可能性もありますが....

titokani
質問者

お礼

う~ん、そうですか、私の英語力では読みきれない可能性が高そうです・・・(^^; C/C++だと、日本語でもそれなりに信頼できる資料があるんですがね。 今後の課題ということにしておきます。 ありがとうございました。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

uint a=0xffff0000; long b=-100; である場合、 a+=b; の結果は、どのような値を期待されていますか。

titokani
質問者

補足

0xffff000-100の値です。 0xfffeff9cですね。

回答No.1

符号なし整数型に符号付き整数の演算を行っているのだからエラーになります。 何をやりたいのか明確にした上で、b の方を符号なし整数型に変換して演算してください。符号付き整数型の負の数を単純に符号なし整数型に変換しただけではうまく動きません。

titokani
質問者

補足

エラーの理由はわかります。 -100を符号なしにするとは、どういった操作になるのでしょうか。 いまのところ、bが正か負かで処理を分けるしかないのかなと思っているのですが。