2011-09-28 10 views
9

mam coś takiego:Dlaczego std :: cout nie drukuje poprawnej wartości dla mojego numeru int8_t?

int8_t value; 
value = -27; 

std::cout << value << std::endl; 

Kiedy uruchomić mój program otrzymuję błędną wartość losową z <E5> wysyłane do ekranu, ale kiedy uruchomić program w gdb i używać p value wypisze -27, który jest poprawną wartością. Czy ktoś ma jakieś pomysły?

+0

użycie [ 'std :: cout << + value'] (https: // stackoverflow. com/a/28414758/995714) –

Odpowiedz

19

Ponieważ int8_t jest taka sama jak signed char i char nie jest traktowana jako liczba przez strumień. Prześlij do np. int16_t

std::cout << static_cast<int16_t>(value) << std::endl; 

a otrzymasz poprawny wynik.

+1

ponieważ typ int16_t nie może być liczbą całkowitą (jak potok rozumie) może powinieneś przypisać do 'int'. –

2

Dzieje się tak, ponieważ int8_t jest synonimem podpisana char.

Tak więc wartość będzie pokazana jako wartość char.

Aby wymusić int wyświetlacza można użyć

std::cout << (int) 'a' << std::endl; 

To będzie działać, dopóki nie wymagają specjalnego formatowania, np

std::cout << std::hex << (int) 'a' << std::endl; 

W takim przypadku dostaniesz artefakty z poszerzonym wielkości, zwłaszcza jeśli wartość char jest ujemna (można dostać FFFFFFFF lub FFFF dla (int)(int8_t)-1 zamiast FF)

Edytuj patrz także ten bardzo czytelny writeup że idzie do bardziej szczegółowo i oferuje więcej strategie „deal” z tym: http://blog.mezeske.com/?p=170


zależności od architektury i kompilator

1

Wygląda na to, że drukowana jest wartość jako znak - jeśli użyjesz "wartości char;" zamiast tego drukuje to samo. int8_t pochodzi ze standardowej biblioteki C, więc może być tak, że cout nie jest na nią przygotowany (lub jest po prostu wpisany typem char).

3

Najprawdopodobniej int8_t jest

typedef char int8_t 

Dlatego podczas korzystania stream out "wartość" typ bazowy (char) jest drukowany.

Jednym z rozwiązań, aby uzyskać "liczba całkowita" drukowany jest wpisanie wartości rzucania przed streaming int8_t:

std::cout << static_cast<int>(value) << std::endl;