5

Powiedzmy mam następujący struct:Czy pola bitowe mniejsze niż int powinny być przedmiotem integralnej promocji?

struct A 
{ 
    unsigned int a : 1; 
    unsigned int b : 1; 
}; 

Co mnie interesuje to rodzaj ekspresji a + b. Podczas gdy technicznie pola bitowe mają "typ" o rozmiarze mniejszym niż int, prawdopodobnie powinna się odbyć integralna promocja, a następnie wynik to int, tak jak to się dzieje w gcc i clang.

Ale ponieważ nie jest możliwe wyodrębnienie dokładnego rodzaju samego pola bitowego i zawsze będzie można wywnioskować, że jest to jego "duży" typ (tj. unsigned int w tym przypadku), czy to prawda, że ​​powinna nastąpić integralna promocja? Ponieważ nie możemy mówić o dokładnych typach i ich rozmiarach dla pól bitowych, z wyjątkiem tego, że są one wyprowadzane jako unsigned int, w takim przypadku integralna promocja nie powinna mieć miejsca.

(Ponownie moje pytanie wynika z faktu, że MSVC zdarza się myśleć, że unsigned int jest rodzaj takiej wypowiedzi)

+0

Która wersja studia wizualnego prawdopodobnie ma sens, aby dodać ten tag na wypadek, gdyby inne osoby miały ten sam problem? –

+0

@ShafikYaghmour Jest to najnowszy, ale dodałem go na wszelki wypadek. – Predelnik

+0

Również istotne: [Dlaczego krótki powinien być konwertowany na int przed operacjami arytmetycznymi w C i C++?] (Http://stackoverflow.com/q/24371868/1708801) –

Odpowiedz

4

Jeśli idziemy do sekcji draft C++ standard: N41405 mówi:

Wielu operatorów binarnych które oczekują, że operandy arytmetyczne lub typu wyliczeniowego powodują konwersje i uzyskują wyniki typów w podobny sposób. Celem jest uzyskanie wspólnego typu, który jest również typem rezultatu . Wzorzec ten jest nazywany zwykle arytmetycznych konwersji, które są zdefiniowane następująco

i stosuje się następującą kula:

  • W przeciwnym razie, integralny promocje (4.5) powinny być wykonywane na obu argumentów. 61 wtedy następujące zasady stosuje się do promowanych argumentów:

i sekta jon 4,5 który mówi (nacisk kopalni)

prvalue integralne bitowego pola (9,6) może być przekształcony w prvalue z typu int jeśli Int może reprezentować wszystkie wartości bit -pole; w przeciwnym razie można go przekonwertować na unsigned int, jeśli unsigned int może reprezentować wszystkie wartości pola bitowego. Jeśli pole bitowe jest większe niż , nie ma w nim zastosowania integralna promocja. Jeśli pole bitowe ma typ wyliczeniowy , jest traktowane jak każda inna wartość tego typu dla celów promocji .

Tak więc gcc i clang są poprawne, a i b powinny być promowane do int.

Powiązane problemy