2016-06-30 31 views
5

Próbowałem replikować this, ale nie skompilowałem.C++ cast unsigned to signed

unsigned char x = 0; 
reinterpret_cast<signed char>(x); 

Mówi

C:\Users\SXG5558\Documents\Arduino\sketch_jun30a\sketch_jun30a.ino: In function 'void setup()': 

sketch_jun30a:3: error: invalid cast from type 'unsigned char' to type 'signed char' 

    reinterpret_cast<signed char>(x); 

            ^

exit status 1 

EDIT:

Żeby było jasne, ja naprawdę chcę reinterpretacji bity w pamięci od podpisał unsigned. Piszę bibliotekę I2C, która odczytuje i zapisuje niepodpisane dane, ale używam tej biblioteki do kontrolowania czujników, które są podpisane, więc chcę ponownie zinterpretować rzucenie rzeczywistych danych.

+7

przykład, który łączysz, ma postać 'reinterpret_cast (x);'. Zauważ, że '&' – user463035818

+1

Czy tytuł pytania nie wymaga po prostu przeciwnego kierunku rzucania, jak pokazano w twoim kodzie? –

+0

po prostu użyj nuke-it '(signed char) x' cast. – pm100

Odpowiedz

5

Istotna część z cppreference.com jest

Rodzaj aliasing

Kiedy wskaźnik lub odniesienie do obiektu, którego dynamiczny typ jest DynamicType jest reinterpret_cast (lub C-style cast) do wskaźnika lub odniesienia do obiektu innego typu AliasedType, rzutowanie zawsze się powiedzie, ale wynikowy wskaźnik lub odwołanie może być użyte tylko w celu uzyskania dostępu do obiektu, jeśli spełniony jest jeden z następujących warunków:

[...]

  • AliasedType jest (ewentualnie cv wykwalifikowany) podpisane lub niepodpisane wariant DynamicType

[...]

tj. zapomniałeś & z podanego przykładu.

+1

Nie mogę uwierzyć, że to przegapiłem. Dziękuję za odpowiedź na głupie pytanie. – charmoniumQ

+0

@Sam właściwie to nie jest takie głupie pytanie. Potrzebowałem trochę czasu, aby zrozumieć, dlaczego nie działa bez '&' i nadal nie mogłem tego wyjaśnić ... – user463035818

+0

Myślę, że jest tak, że zadanie przechodzi prawidłowo (np. 'Reinterpret_cast (x) = 10') . To nasuwa pytanie, co jeśli nie chcesz tej funkcjonalności? Jak można rzucić 'reinterpret_cast (f())' bez przypisywania wyniku 'f()' do zmiennej tymczasowej. – charmoniumQ