10

to pytanie Implicit type conversion rules in C++ operators (i kilka innych) StanNiejawna konwersja: czy poniższe ostrzeżenie jest prawidłowe?

Jeśli któryś jest long long unsigned int drugi jest promowany na długi długi unsigned int

Jednakże jeśli I wykonaj następujące czynności pod MSVC:

unsigned int a = <some expression>; 
unsigned long long b = a << 32ULL; 

druga linia wytwarza się następujące ostrzeżenie:

warning C4293: '<<': shift count negative or too big, undefined behavior 

32ULL to 64-bitowa wartość bez znaku, dlatego zgodnie z niejawnymi regułami konwersji powinno to oznaczać, że a jest również konwertowane na unsigned long long. Dlatego przesuwaję wartość 64-bitową o 32 bity, wyraźnie dobrze zdefiniowaną operację.

Czy MSVC jest błędny, czy jest usterka w mojej logice?

+1

Zmiany są wyjątkowe. –

+0

Visual Studio 2015. To powiedziawszy, mam 99,9% pewności, że otrzymaliśmy to samo ostrzeżenie od VS 2010 przed aktualizacją, a szybki test z VS 2017 również daje takie samo ostrzeżenie. – dgnuff

+0

To wymaga tagu prawnika języka. Jest to subtelna różnica pomiędzy "zwykłymi konwersjami arytmetycznymi" i "promocjami integralnymi". Są różne rzeczy, ale oba się zdarzają i oba mogą konwertować wartości. – Persixty

Odpowiedz

Powiązane problemy