Właśnie brałem test C++ i otrzymałem następujące pytanie:Test C++ - Czy znak 1 oznacza zawsze ujemny?
Pytanie: Jaki jest wynik tego programu?
#include <iostream>
#include <stdint.h>
using namespace std;
int main() {
int a = 0;
for (int8_t i = 1; i > 0; i <<= 1)
a++;
cout << a;
return 0;
}
wystąpiły następujące odpowiedzi do wyboru
- Undefined Behavior
- Błąd kompilacji
W "poprawne "odpowiedź brzmiała 7. Jeśli w odpowiedziach było" zachowanie zdefiniowane przez implementację ", wybrałbym to, więc wybrałem niezdefiniowane zachowanie, które było najbliższe. Rozumiem, że w znak-i-magnitorze, dopełnienie 1 i uzupełnienie dwójki to odpowiedź 7. Ale czy standard C++ teoretycznie nie zezwala na jakiekolwiek inne reprezentacje liczbowe? Na przykład znak i wielkość, ale 0 oznacza minus?
Czy mam rację, że prawdziwą poprawną odpowiedzią na to pytanie powinno być zachowanie zdefiniowane w ramach realizacji, a jeśli nie, proszę wyjaśnić, dlaczego odpowiedź brzmi 7 niezależnie od implementacji?
Czytałem komentarze na pytanie i wydaje się, że początkowo rodzaj a
było char, który najwyraźniej wzbudził wiele skarg czy char
jest podpisany, czy nie, więc testsetter zmienił go do int8_t. Jako pytanie premiowe, jest <stdint.h>
częścią C++? O_O
'' jest częścią C++ (dołączono do kompatybilności z C). Istnieje jego wersja C++, ''. –
Każda rozsądna implementacja C++ powinna zawierać 'stdint.h', ale w C++ 11 jest oficjalnie' cstdint'. (@AlexeyFrunze: tylko C++ 11!) –
[Implementacje nie muszą nawet podawać "int8_t"] (http://stackoverflow.com/a/5254321/168175) – Flexo