c++ Vektorgröße. warum -1 größer als null ist

Lesezeit: 2 Minuten

c Vektorgrose warum 1 groser als null ist
Andrej Tschernukha

Bitte werfen Sie einen Blick auf dieses einfache Programm:

#include <iostream>
#include <vector>

using namespace std;

int main() {

vector<int> a;

std::cout << "vector size " << a.size() << std::endl;

int b = -1;

if (b < a.size())
   std::cout << "Less";
else
   std::cout << "Greater";

    return 0;
}

Ich bin verwirrt über die Tatsache, dass es “Greater” ausgibt, obwohl es offensichtlich ist, dass -1 kleiner als 0 ist. Das verstehe ich size Die Methode gibt einen vorzeichenlosen Wert zurück, aber der Vergleich wird immer noch auf -1 und 0 angewendet. Was ist also los? kann das jemand erklären?

  • -1 ohne Vorzeichen ist größer als 0 ohne Vorzeichen, da das High-Bit gesetzt ist, weil es negativ ist.

    – Jesus Ramos

    27. April 2013 um 8:42 Uhr

  • @JesusRamos – oder abstrakter, weil die Sprachdefinition besagt, dass Werte, die nicht in den Bereich eines vorzeichenlosen Typs passen, modulo 2 ^ n reduziert werden, wobei n die Anzahl der Bits ist, die zur Darstellung des vorzeichenlosen Typs verwendet werden. Bei Zweierkomplementdarstellungen, der heutzutage gebräuchlichsten Darstellung für ganzzahlige Typen, liegt dies in der Tat daran, dass das High-Bit gesetzt ist. Aber auch andere Darstellungen sind erlaubt.

    – Peter Becker

    27. April 2013 um 11:02 Uhr

  • Es geht nicht einmal darum, „abstrakt“ zu sein; das sind die Regeln der Sprache. C++ behandelt keine “hohen Bits”; es handelt sich um einen Vertrag.

    – Asteroiden mit Flügeln

    9. März 2020 um 22:42 Uhr

Weil die Größe eines Vektors ein ganzzahliger Typ ohne Vorzeichen ist. Sie vergleichen einen vorzeichenlosen Typ mit einem vorzeichenbehafteten Typ, und die negative vorzeichenbehaftete Ganzzahl des Zweierkomplements wird zu unsigned befördert. Das entspricht einem großen vorzeichenlosen Wert.

Dieses Codebeispiel zeigt das gleiche Verhalten, das Sie sehen:

#include <iostream>
int main()
{
  std::cout << std::boolalpha;
  unsigned int a = 0;
  int b = -1;
  std::cout << (b < a) << "\n"; 
}

Ausgang:

falsch

Die Unterschrift für vector::size() ist:

size_type size() const noexcept;

size_type ist ein ohne Vorzeichen integraler Typ. Beim Vergleich einer vorzeichenlosen und einer vorzeichenbehafteten Ganzzahl wird die vorzeichenbehaftete zu einer vorzeichenlosen hochgestuft. Hier, -1 negativ ist, also rollt es um, was effektiv den maximal darstellbaren Wert von ergibt size_type Art. Daher wird es als größer als Null verglichen.

-1 ohne Vorzeichen ist ein höherer Wert als Null, da das hohe Bit gesetzt ist, um anzuzeigen, dass es negativ ist, aber der vorzeichenlose Vergleich verwendet dieses Bit, um den Bereich der darstellbaren Zahlen zu erweitern, sodass es nicht mehr als Vorzeichenbit verwendet wird. Der Vergleich erfolgt wie folgt (unsigned int)-1 < 0 was falsch ist.

  • Es geht nicht um “hohe Bits”. Es geht um die Regeln. Und die Regeln lauten, dass -1 in ein unsigned int umgewandelt wird, um den oberen Rand des unsigned int-Bereichs herumläuft. Die bitweise Darstellung könnte nicht weniger relevant sein, obwohl sie praktischerweise auf vielen Systemen übereinstimmt.

    – Asteroiden mit Flügeln

    9. März 2020 um 22:43 Uhr


923470cookie-checkc++ Vektorgröße. warum -1 größer als null ist

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

Privacy policy