マイクロソフトドキュメント
https://docs.microsoft.com/ja-jp/cpp/c-language/unary-arithmetic-operators?view=msvc-160
に「算術否定演算子は、オペランドの負数 (2 の補数) を生成します。 オペランドは整数値または浮動小数点値である必要があります。」と記述がありましたが、この記述は正しいですか?
私は「処理系によっては算術否定演算子は2の補数を生成しないのではないか」と思いました。
この質問をした背景には"新明解C言語入門編 柴田望洋" 186ページの記述「符号付き整数の内部表現は、処理系によって異なります。」、及び、以下のソースコード内に書いた疑問があります。
該当のソースコード
C言語
1// 前提 私の処理系では「符号つき整数の内部表現は1の補数表現を使っている」とします。また、sizeof(int)..4とします 2 3# include <stdio.h> 4# define LINE "12345678901234567890123456789012\n" 5 6int main(void) 7{ 8 9unsigned int a=3; 10printf(LINE); 11printf("00000000000000000000000000000011..aの内部ビット\n"); 12// aの内部ビット 00000000000000000000000000000011 13int b=-3; 14printf("11111111111111111111111111111100..bの内部ビット\n"); 15// bの内部ビット 11111111111111111111111111111100 16// 符号つき整数の内部表現は1の補数表現を使っている 17a=-a; 18printf("11111111111111111111111111111101..aの内部ビット\n"); 19// aの内部ビット 11111111111111111111111111111101 20// 「算術否定演算子は、オペランドの負数 (2 の補数) を生成します。 オペランドは整数値または浮動小数点値である必要があります。」が正しいなら、aの内部ビットは2の補数表現が使われているはず 21 22// このとき、aの内部ビットとbの内部ビットは異なっていますが、このことに疑問(そんなことある?)を感じました 23 24return 0; 25} 26
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
cygwinでgccコンパイラを使っています。
算術否定演算子-の定義だったり、とても詳しい説明だったりをご存知の方がおりましたら、サイトへのリンクでも構いませんのでどうか教えていただきです
回答3件
あなたの回答
tips
プレビュー