2012-04-01 18 views
10

Zaprogramowałem klasę o nazwie HugeInteger, która może wykonywać operacje arytmetyczne (dodawać, przesyłać, mnożyć) z liczbami o rozmiarze "nieskończenie". Traktuje każdy bit cyfry liczby jako samodzielną cyfrę (np. 1234 = 1, 2, 3 i 4). Przechowuję te liczby w wektorze (vector<short>). Teraz, ponieważ każda cyfra może przyjmować wartości od 0 do 9, nie muszę ich zapisywać jako cyfry 2-bajtowej. Czy istnieje sposób (bez użycia char) do przechowywania cyfr jako 1-bajtowej liczby całkowitej bez znaku? Dzięki!1-bajtowa liczba całkowita bez znaku C++

Aktualizacja:

vector<unsigned char> v; 
v.push_back(1); 
v.push_back(2); 

for (size_t i = 0; i < v.size(); i++) 
    cout << v[i]; 

To wywołuje niepożądane komunikaty. Który typ danych powinienem użyć do iteracji przez wektor?

+5

Dlaczego bez użycia 'char'? – jwodder

+1

Nagłówek udostępnia typ o nazwie "uint8_t" - jeśli to środowisko obsługuje taki typ. Należy pamiętać, że "uint8_t" może być typedef dla "unsigned char". Tak więc przeciążenie może nie działać zgodnie z oczekiwaniami we wszystkich przypadkach. – nosid

+3

'unsigned char' to" jednobajtowa liczba całkowita bez znaku "C++ z definicji. Dlaczego nie chcesz rozwiązać swojego problemu? –

Odpowiedz

21

Tak, użyj unsigned char.

Jeśli dostępny jest <stdint.h>, można również użyć uint8_t.

+0

'uint8_t' to albo jeden bajt albo błąd kompilacji. 'unsigned char' może być większy niż jeden bajt (ale tylko w systemach, w których' uint8_t' jest błędem kompilacji). –

+1

@Ben: 'unsigned char' jest zawsze" bajtem ", ale w języku C/C++ ten" bajt "może mieć więcej niż 8 bitów (choć zwykle tylko na architekturach, które według dzisiejszych standardów są uważane za nietypowe). –

7

Nie pozwól, aby standardowy kompilator typu char wprowadził Cię w błąd; dodaje to całkowicie legalne:

char number[5] = { 1, 4, 3, 6, 2}; // Representation of decimal 14,362 

To nie tak, że nie ma nic szczególnego rodzaju char że zmusza do myślenia o nich jako znaków; raczej jest to ich dogodny rozmiar tylko jednego bajtu, który sprawia, że ​​są odpowiednie do przechowywania wartości, które są używane w procedurach bibliotecznych, takich jak printf, do przechowywania wartości 1-bajtowych, które będą interpretować jako znaki pod odpowiednim kodowaniem.

+0

Tak, to było dla mnie nowe. Chciałem, że potrzebowałem pojedynczych cudzysłowów wokół każdego znaku. Dzięki za wskazówkę! – raze

1

uint_least8_t to najbardziej kompaktowy typ danych do przechowywania pojedynczej cyfry dziesiętnej.

Jeśli system obsługuje typ danych o rozmiarze 1 bajta, to będzie to. W przeciwnym razie będzie to następny najmniejszy dostępny typ danych.

Może zaistnieć potrzeba rzucenia wartości podczas korzystania z operatora wstawiania strumieniowego, aby upewnić się, że zamiast przetwarzania znaków uzyskano wynik liczbowy.

1

Wyjście widzisz z użyciem cout < < na unsigned char jest w dół do mechanika operatora < < gdy używana z std :: ostream (konkretnie różne przeciążenia operatora < < wyświetli wartości na różne sposoby - char/unsigned char przeciążenia zwykle zakładają, że chcesz zamiast znaku numerycznego reprezentacji znaku)

Podstawowa reprezentacja niepodpisanego znaku to nadal ta sama liczba, którą wepchnąłeś do wektora - unsigned char to nadal niepodpisana 1-bajtowa liczba całkowita)

Jeśli chcesz zmienić wyjście, to trzeba unikać używania przeciążenie < < operatora, który jest przeznaczony dla char lub unsigned char - Najprostszym sposobem na to jest wykonać odlew

vector<unsigned char> v; 
v.push_back(1); 
v.push_back(2); 

for (size_t i = 0; i < v.size(); i++) 
    cout << static_cast<int>(v[i]); 
0

Używanie char lub unsigned char jako 1-bajtowego typu integer nie zawsze jest proste ... Czasami wystarczy typ, aby był to typ numeru, a nie typ znaku. Jednym z takich przykładów jest tutaj: 1 byte integer data type Innym przykładem jest przeciążenie funkcji dla różnych typów argumentów.

Powiązane problemy