プログラミングについて学ぶためにこれを行っている場合は、答えを確認するのに役立つプログラミングを少し行うことができます。
#include <iostream>
int abs(int x) { return x >= 0 ? x : -x; }
int main()
{
for (int i = -128; i <= 127; ++i)
{
char x = i;
char y;
if (x > 0)
y = x;
else
y = -x;
if (!(y >= 0 && abs(y) == abs(x)))
std::cout << "failed for " << i << " (y " << (int)y << ")\n";
}
}
x
これを実行すると、 -128(-128)で失敗するかどうかがわかりますy
。これは、2の補数表記の非対称性によるものです。-128は8ビット文字で表すことができますが、128はできません(127のみ)。
したがって、1の場合、2の補数整数を想定すると、前提条件はx
、ビット幅で表現可能な最小値ではないということです。もちろん、xとyがintでさえあるという質問には何もありませんので、それはすべて少し暫定的です。
x
とが浮動小数点数または倍精度浮動小数点数である場合y
、通常のIEEE表現には、仮数または指数に影響を与えずに切り替えることができる符号ビットがあり、符号の「クリーンな」変更が可能です。とは言うものの、「数ではない」(NaN)および(正と負の)無限番兵の値を持つコーナーケースもあります。これは、実験的に、および/または表現と動作仕様を研究することによって確認するのが賢明です。
理由を説明してください[{y>=0 && | y | == | x | }]は、{y>=0}よりもコードの検証に適しています。
コードが何を達成しようとしているのかわからないので、漠然とした質問です。それについての私たちの推論は、前者の事後条件が後者よりも優れているという主張から循環的に来ています。それでも、彼らは次のような答えを求めています。前者はy
、コードによって行われた符号の変更が何であれ、の絶対等級が生き残ることも保証しx
ます。
実際には、2の補数の整数の場合、大きさはその後常に一致していました。これは、コーナーケースにフラグを立てた事後条件の符号部分でした。しかし、何が期待されているかについての追加の洞察を持っていることは、それでも安心です。