2016-07-09 21 views
12

Próbuję zrozumieć, co dokładnie zwraca bitowego operatora dopełnienia w C. (. Nie chodzi o „których wartość”, ale z punktu widzenia „który typ danych” Chyba rozumiem, jak bit stanowić uzupełnienie theorethically działa, więc nie ma potrzeby, aby reexplain że)Co to jest typ danych zwracany przez operację sumowania bitowego?

Rozważmy następujący kod:

int main(int argc, char **argv){ 
    char c = 'A'; 
    printf("%d, %d\n", sizeof(c), sizeof(~c)); 
    return 0; 
} 

Podczas gdy pierwszy sizeof() zwraca 1, ten ostatni zwraca 4 na moim komputerze.

Moje pytanie brzmi: którego typem danych jest ~ c?

Pracuję na 32-bitowym systemie Linux, czy wynik zmieniłby się na 8, gdybym pracował na maszynie 64-bitowej? Zgaduję, że operacja bitowa jest stosowana do rejestru, a wartość zwracana nie jest zwracana do wartości char. Czy to zachowanie może być inne w przypadku innych kompilatorów, czy też standard C określa, co jest zwracane przez ~ c?

+1

'~' jest 1 jest uzupełnieniem, a nie 2 jest uzupełnieniem –

+3

Możliwy duplikat [Co się dzieje z operatory bitowe i całkowite promocje?] (http://stackoverflow.com/questions/30473958/what-is-going-on-with-bitwise-operators-and-integer-promotion) –

Odpowiedz

20

operatora ~, przed właściwym wykonuje promocjami Integer rodzaju,
więc typ ~c jest realizacja wyżej znaczenia, albo int lub unsigned int.

Należy również pamiętać, że wynik sizeof jest typem size_t które powinny być drukowane z %zu nie %d.


(Cytat z ISO: IEC 9899: 201x 6.3.1.1 logiczne, znaków, liczb całkowitych i 2)
Jeśli int może reprezentować wszystkie wartości tego samego typu (jak ograniczona przez szerokość, dla pola bitowego ), wartość jest konwertowana na int; w przeciwnym razie zostanie przekonwertowany na unsigned int. Są to tak zwane promocje bezpośrednie. 58) Wszystkie pozostałe typy są niezmienione przez promocje o wartości całkowitej z zakresu . 58) Awarie liczb całkowitych są stosowane tylko: jako część zwykłych konwersji arytmetycznych, do niektórych argumentów wyrażenia , do operandów operatorów jednoargumentowych +, - i ~ oraz do obu operandów operatorów przesunięć , określonych przez ich odpowiednie podrozdziały.

Aby wyjaśnić, dlaczego oba typy i nie tylko int. Dzieje się tak dlatego, że char może być podpisany lub niepodpisany, a standard C dla jest dozwolony, aby nie być reprezentowany przez int, ponieważ zakres tego ostatniego może być zbyt mały. Gdybyś wybrał typ signed char, mógł on być promowany tylko do int.

7

Od 6.5.3.3, Jednoargumentowe operatory arytmetyczne:

Ograniczenia:

Argument z jednoargumentowego + lub - operatora mają arytmetyczną typu; operatora ~, typ całkowity; operatora !, typ skalarny.

semantyka:

Wynik operatora ~ jest bitowe uzupełnienie jej (promowane) argumentu operacji (to znaczy, każdy bit w rezultacie jest tylko wtedy, gdy odpowiedni bit w konwertowanym operandzie nie jest ustawiony.) Liczba całkowitych promocji jest wykonywana na operandzie, i wynik ma promowany typ.

Podsumowując Argument z ~ ma integralną typu wartość argumentu jest promowany według promocji całkowitych, a typ wyniku ekspresji jest promowany typu. (Promocje Integer włączyć coś „mniejsza” niż int w OSOBĄ int lub unsigned int i zostawić wszystko inne, jak jest.)