2017-10-02 10 views
-2

는 I 코드 청크가 모든 비트를 플립 ~ 단항 연산자, ~i-125하지만 내 코드 내게 이진 0b00000011이다 -3의 출력을 제공 0b11111101 같아야c의 1의 보수 ~ 연산자가 비트를 올바르게 뒤집지 않습니까?

#include <stdio.h> 

int main() { 
    char i = 0b00000010; //2 
    printf("%d", ~i); 
} 

경우. 몇 가지 이유를 설명해주세요. (기계가 대부분 사용하는 것입니다) 음수를 표현하기 위해 two's complement 가정

+4

'11111101'은'-3'입니다. –

+1

2의 보완에 대해서도 배우십시오. – taskinoor

+0

잘 작동합니다. – RSon1234

답변

4

:

0b11111101 -3하지 -125입니다. 당신은 매우 드문 일이다, sign-magnitude 가정 것 같다 3.

것 -125 0b00000011 동안

0b10000011

이 될 것입니다.

연산자 ~ 연산자가 모든 비트를 뒤집지만 해당 비트가 음수를 나타내는 것은 시스템에 따라 다릅니다. C는 sign-magnitude, ones' complement 및 2의 보수의 세 가지 다른 표현을 허용합니다. 실제로는 2의 보수가 거의 항상 사용됩니다.


또한 C는 char에서 실제로 작동 할 수 없습니다. 표현식에서 char 값을 사용하려고 시도하면 먼저 int으로 승격됩니다. 그래서 실제로 ~i에서 무슨 일이 일어나고 있는지입니다 :

  • i의 값은 (char 2) 읽습니다.
  • int (int 2)로 변환됩니다.
  • int의 비트 수 (일반적으로 32 또는 64)에 따라 모든 비트가 반전됩니다 (int0b1111111....111101).
  • 비트는 -3에 해당하는 2의 보수 표현에 따라 해석됩니다. 이 경우

는 결과는 차이가 없습니다 있도록, 다음, 첫번째 char에서 작업을 수행 int에 결과를 변환 것처럼 동일하지만,이 C가 그것을 수행하는 방법이다.

+0

'~ i'에서'i'가'int '처음으로 –

+0

, 감사합니다! –