Wie verhält es sich beim Konvertieren eines negativen Gleitkommawerts in ein unsigned int? [duplicate]

Lesezeit: 4 Minuten

Benutzeravatar von user1095108
Benutzer1095108

Was passiert, wenn ein negativer Gleitkommawert in einen Wert vom Typ Ganzzahl ohne Vorzeichen umgewandelt wird? Standardangebote wären wünschenswert. Das Problem, mit dem ich konfrontiert bin, ist die Konvertierung in Werte von vorzeichenlosen ganzzahligen Typen aus einer Variant-Klasse, die ein Objekt vom Typ Gleitkomma enthält.

BEISPIEL:

unsigned i = -.1;

  • Bitte definiere umgewandelt.

    – Sourav Ghosh

    6. April 2016 um 6:52 Uhr

  • Hast du Versuch es? Welche Probleme hast du?

    – jtbandes

    6. April 2016 um 6:57 Uhr

  • @jtbandes: Das ist eine tiefe Frage. Es wird bestenfalls durch die Implementierung definiert.

    – Bathseba

    6. April 2016 um 6:57 Uhr

  • @SouravGhosh Ich würde die C-Standarddefinition der Konvertierung annehmen, wie in Kapitel 6.3 erläutert.

    – Ludin

    6. April 2016 um 6:57 Uhr

  • @jtbandes zu versuchen ist der schlechteste Weg, es anzugehen.

    – Antti Haapala – Слава Україні

    6. April 2016 um 7:49 Uhr

Benutzeravatar von Lundin
Lundin

Falls der negative Wert -1,0 oder niedriger ist, wird ein undefiniertes Verhalten aufgerufen, da der ganzzahlige Teil dann nicht durch eine Zahl ohne Vorzeichen dargestellt werden kann. Andernfalls (wie im Fall von -0.1) handelt es sich um ein wohldefiniertes Verhalten, wenn es durch einen ganzzahligen Typ dargestellt werden kann. Siehe C11-Standard, ISO 9899:2011:

6.3.1.4

Wenn ein endlicher Wert vom Typ Real Floating in einen anderen Integer-Typ als _Bool konvertiert wird, wird der Bruchteil verworfen (dh der Wert wird in Richtung Null gekürzt). Wenn der Wert des ganzzahligen Teils nicht durch den ganzzahligen Typ dargestellt werden kann, ist das Verhalten undefiniert. 61)

Und dann gibt es noch eine nicht normative Fußnote, die den obigen Text erklärt:

61) Die verbleibende Operation, die durchgeführt wird, wenn ein Wert vom Integertyp in einen vorzeichenlosen Typ umgewandelt wird, muss nicht durchgeführt werden, wenn ein Wert vom reellen Fließkommatyp in einen vorzeichenlosen Typ umgewandelt wird. Somit ist der Bereich der tragbaren reellen Floating-Werte (–1, Utype_MAX+1).

ISO/IEC 9899:1999 (C99) enthält genau denselben Text.

  • Ist das die C-Norm? Eigentlich habe ich bemerkt, dass die Frage mit mehreren Tags versehen ist. Haben Sie eine positive Stimme.

    – Bathseba

    6. April 2016 um 6:57 Uhr


  • @Bathsheba Die Frage ist sowohl mit C als auch mit C ++ gekennzeichnet, sodass jeder Standard relevant wäre. Aber es ist eine gute Frage.

    – Markieren Sie Lösegeld

    6. April 2016 um 6:57 Uhr

  • @Lundin, aber die Frage tut explizit -.1, was abgeschnitten darstellbar wäre.

    – Antti Haapala – Слава Україні

    6. April 2016 um 7:51 Uhr

  • Wie Antti betont (unsigned)-.1 liegt innerhalb des Bereichs (–1, Utype_MAX+1), sodass dieser spezielle Fall kein undefiniertes Verhalten ist. Wir könnten die Antwort umschreiben, Mit Ausnahme von negativen Werten über -1,0ruft es undefiniertes Verhalten auf.

    – Toby Speight

    6. April 2016 um 10:24 Uhr


  • @TobySpeight Vielleicht meinst du “Mit Ausnahme negativer Werte unter/weniger als -1,0″

    – nalzok

    6. April 2016 um 16:37 Uhr

atturris Benutzeravatar
atturri

Es ist ein undefiniertes Verhalten in C99, wenn die Gleitkommazahl kleiner oder gleich -1,0 ist. Wenn es im Bereich (-1,0, 0,0) liegt, ist der resultierende Wert 0.

Aus C99, §6.3.1.4, Absatz 1

Wenn ein endlicher Wert vom Typ Real Floating in einen anderen Integer-Typ als _Bool konvertiert wird, wird der Bruchteil verworfen (dh der Wert wird in Richtung Null gekürzt). Wenn der Wert des ganzzahligen Teils nicht durch den ganzzahligen Typ dargestellt werden kann, ist das Verhalten undefiniert

Fußnote 50 verdeutlicht das Verhalten für den Bereich (-1,0, 0,0).

Benutzeravatar von nalzok
nalzok

Ihr Beispiel, unsigned i = -.1; ist gut definiert sowohl von C11 als auch von C99, und das Ergebnis ist i == 0.

Zitiert aus N15706.3.1.4 Gleitkommazahl und Ganzzahl:

  1. Wenn ein endlicher Wert vom Typ Real Floating in einen anderen Integer-Typ als _Bool konvertiert wird, wird der Bruchteil verworfen (dh der Wert wird in Richtung Null gekürzt). Wenn der Wert des ganzzahligen Teils nicht durch den Integer-Typ dargestellt werden kann, ist das Verhalten undefiniert.61)

61) Die verbleibende Operation, die durchgeführt wird, wenn ein Wert vom Integertyp in einen vorzeichenlosen Typ umgewandelt wird, muss nicht durchgeführt werden, wenn ein Wert vom reellen Fließkommatyp in einen vorzeichenlosen Typ umgewandelt wird. Somit ist der Bereich der tragbaren reellen Floating-Werte (-1, Utype_MAX+1).

Zitiert aus N8696.3.1.4 Gleitkommazahl und Ganzzahl:

#1

Wenn ein endlicher Wert vom Typ Real Floating in einen anderen Integer-Typ als _Bool konvertiert wird, wird der Bruchteil verworfen (dh der Wert wird in Richtung Null gekürzt). Wenn der Wert des ganzzahligen Teils nicht durch den Integer-Typ dargestellt werden kann, ist das Verhalten undefiniert.43)

43) Die verbleibende Operation, die durchgeführt wird, wenn ein Wert vom Integertyp in einen vorzeichenlosen Typ konvertiert wird, muss nicht ausgeführt werden, wenn ein Wert vom realen Floating-Typ in einen vorzeichenlosen Typ konvertiert wird. Somit ist der Bereich der tragbaren reellen Floating-Werte (-1, Utype_MAX+1).

Wie Sie jedoch aus den Zitaten ersehen können, führt der Versuch, Gleitkommakonstanten außerhalb des Bereichs (-1, Utype_MAX+1) zu konvertieren, zu undefiniertem Verhalten.

1389760cookie-checkWie verhält es sich beim Konvertieren eines negativen Gleitkommawerts in ein unsigned int? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy