uint8_t - unsigned int max c++




Perché il tipo intero int64_t non può contenere questo valore legale? (2)

Sto cercando di scrivere un caso di prova per un caso d'angolo. Per input di tipo int64_t , la seguente riga non verrà compilata:

int64_t a = -9223372036854775808LL;

L'errore / avviso è:

error: integer constant is so large that it is unsigned [-Werror]

Pensavo che il numero fosse fuori portata, quindi ho provato:

std::cout << std::numeric_limits<int64_t>::min() << std::endl;

Emette esattamente lo stesso numero !!! Quindi la costante è all'interno dell'intervallo.

Come posso correggere questo errore?


Ben ha già spiegato il motivo, ecco altre due possibili soluzioni.

Prova questo

int64_t a = INT64_MIN;

o questo

int64_t a = std::numeric_limits<int64_t>::min();

Puoi scrivere

int64_t a = -1 - 9223372036854775807LL;

Il problema è che il - non fa parte del letterale, è meno unario. Quindi il compilatore prima vede 9223372036854775808LL (fuori portata per int64_t firmato) e poi trova il negativo di questo.

Applicando il meno binario, possiamo usare due letterali che sono ciascuno nel range.





numeric-limits