2016-08-25 14 views
9
#include <stdio.h> 
#include <iostream> 

int main() 
{ 
    using namespace std; 
    uint64_t a = 3; 
    if (uint64_t(~a) == (~a)) 
     cout << "right" << endl;//right 
    else 
     cout << "wrong" << endl; 
    cout << sizeof(~a) << endl;//8 

    uint8_t b = 3; 
    if (uint8_t(~b) == (~b)) 
     cout << "right" << endl; 
    else 
     cout << "wrong" << endl;//wrong 
    cout << sizeof(~b) << endl;//4 
    getchar(); 
    return 0; 
} 

~ uint8_t zwraca wartość int, ale ~ uint64_t zwraca uint64_t.C++ Dlaczego operatory bitowe ~ na uint64_t i uint8_t zwracają różne typy?

Czy to niezdefiniowane zachowanie?

+4

Musisz przejrzeć ogólne zasady promocji. – NathanOliver

+3

jest to zdefiniowane zachowanie, wszystkie operatory arytmetyczne (w tym '~') promują operandy do 'int', jeśli są węższym typem niż' int'. Pochodzi z wczesnych dni C, kiedy arytmetyczna była wykonywana w rejestrach i nie chcieli jej komplikować poprzez symulowanie arytmetyki na mniejszych jednostkach niż rejestr. –

Odpowiedz

6

zamieszczaniu z en.cppreference

Wynikiem operator~ jest NIE bitowe (kod uzupełnień do jedności) wartość argumentu (po awansie).

Integral promotion nakłada się char, short int etc (typów węższych niż int), a wynik musi być lanego do typu docelowego przeznaczenia, jeżeli nie jest int.

Jest to powód sizeof(~b) == sizeof(int) w twoim przypadku.

Powiązane problemy