2

C (C99) の未定義および未指定の動作にまだ苦労しています。

今回は、次の未規定の動作です (附属書 J.1):

その値に対して複数のオブジェクト表現を持つオブジェクトに値を格納するときに使用される表現 (6.2.6.1)。

対応するセクション 6.2.6.1 には次のように記載されています。

複数のオブジェクト表現を持つ値に演算子が適用される場合、どのオブジェクト表現が使用されるかは、結果の値に影響を与えません43)。その値に対して複数のオブジェクト表現を持つ型を使用して値がオブジェクトに格納される場合、どの表現が使用されるかは指定されていませんが、トラップ表現は生成されません。

次の注記 43:

同じ実効型を持つオブジェクトxとは、 type のオブジェクトとしてアクセスされたときに同じ値を持つことができますが、他のコンテキストでは異なる値を持つことができます。特に、type に対して が定義されている場合、 はそれを意味しません。さらに、必ずしもそれを意味するわけではなく、同じ値 を持っています。タイプの値に対する他の操作は、それらを区別する場合があります。yTT==Tx == ymemcmp(&x, &y, sizeof(T)) == 0x == yxyT

複数のオブジェクト表現を持つ値が何であるかさえ理解していません。たとえば、0(負および正のゼロ)の浮動小数点表現に関連していますか?

4

3 に答える 3

-1

ご想像のとおり、-0.0は良い候補ですが、最後のフレーズのみです。

さらに、x == y必ずしもそれを意味するわけではなく、同じ値xを持っています。yタイプの値に対する他の操作はT、それらを区別する場合があります。

double x = 0.0;
double y = -0.0;
if (x == y) {
    printf("x and y have the same value\n");
}
if (memcmp(&x, &y, sizeof(double)) {
    printf("x and y have a different representation\n");
}
if (1 / x != 1 / y) {
    printf("1/x and 1/y have a different value\n");
}

複数の表現が可能な値の別の例は NaN です。NaN 値に評価されます。これは、マクロまたは NaN を生成する別の操作0.0 / 0.0によって生成されたものとは異なる表現を持つ場合があります。また、同じ式が再度評価されることさえあります。表現が異なることを示している可能性があります。ただし、この例は、これらの値が演算子ごとに一致しないため、質問での標準の引用の目的を実際には示していません。NAN0.0 / 0.0memcmp()==

付属書 J から引用したテキストは、パディング ビットおよび/または の 2 つの異なる表現を持つ負の数の表現を持ついくつかのまれなアーキテクチャ (今日) に具体的に対処しているようです0。最新のシステムはすべて 2 の補数を使用負の数を表し、すべてのビット パターンが異なる値を表します。0

于 2021-01-20T16:27:51.637 に答える