C언어에서 보수의 개념이 이해가 안됩니당…

C언어에서 보수의 개념이 이해가 안됩니당…

작성일 2024.04.21댓글 3건
    게시물 수정 , 삭제는 로그인 필요

#include <stdio.h>

int main()
{
int num1=49;

printf(“~num1 = %d₩n”,~num1);


return 0;

}


이런 코드를 작성을 해보았는데요

결과값이 ~num1 = -50이 나오는데 여기서 질문이 있습니다.

1. “~” 연산자는 단순히 비트를 반전시키는 연산자인 것으로 알고 있는데, 그렇다면 num1을 2진수로 바꾸면 00110001이고, 이것을 반전시켰을때 11001110이자나요, 그러면 이것을 10진수로 바꾼 206이 나와야 되는것 아닌가요..?

2.만약 맨앞 비트가 1이어서 음수가 나와야 되는 것이라면,11001110은 206이 아니라 다른 숫자라는 얘긴데,그럼 206은 2진수로 어떻게 표현하나요

3.11001110값이라는 수치가 나왔는데 왜 보수를 사용해야 하며, 보수를 계산해보면 00110010이라는 값이 나오는데,이것이 왜 양수 50이 아니라 -50이 나오는걸까요




질문이 많아서 죄송합니다 ㅠㅠ초보라서…



profile_image 익명 작성일 -

8 비트 바이너리라고 하면,

11001110

은 수치가 아니고, 기호입니다. ON/OFF 대신 1/0 으로 쓴 것이죠.

이 바이너리로 양수만 표현한다면 206 이 되겠지만,

음수도 표현해야 한다면,

양수는 0 부터~ 01111111 까지만 사용되고,

음수는 11111111부터 10000000까지가 사용됩니다.

10진수로 -1 ~ -128 까지의 수에 해당됩니다.

11001110 은 음수를 표현하는 바이너리이므로,

- (11001110의 2의 보수) 가 됩니다.

= - (100000000 - 11001110) 8 비트일 때 x의 2의 보수는 100000000 - x

= - (1+11111111-11001110) 1 + x 의 1의 보수 = 1 + 11111111 - x = 1 + x의 비트 반전

= - (1+00110001)

= - 00110010

10진수로 바꾸면, -(32+16+2) = -50

profile_image 익명 작성일 -

1. "~" 연산자의 동작:

"~" 연산자는 주어진 정수의 비트를 반전시킵니다. 즉, 0을 1로, 1을 0으로 변환합니다.

2. 음수 표현:

C 언어에서 음수는 보수 표현을 사용하여 나타냅니다. 2의 보수의 경우, 음수는 양수의 비트를 반전시킨 후 1을 더하여 표현합니다.

3. 보수 계산과 결과:

num1의 2진수 표현은 00110001입니다.

이를 반전시키면 11001110이 됩니다.

2의 보수를 구하려면 1을 더합니다: 11001110 + 1 = 11001111

이 이진수를 10진수로 변환하면 -50이 됩니다.

결론:

따라서 ~num1 연산은 다음과 같은 단계를 거칩니다.

1. num1의 비트를 반전시킵니다.

2. 2의 보수를 구하여 음수를 표현합니다.

그 결과, num1(~num1 = 11001111)은 -50이 됩니다.

profile_image 익명 작성일 -

1. 비트는 실제 값이 아닙니다. 의도하는 바를 어떻게 비트열로 표현한 것이며, 이를 어떻게 취급하겠다는 규약이 있어야만 의미가 있습니다. "-50"이라고 사람이 써 놨을 때를 생각하면, -와 5, 0이라는 각각의 기호가 무엇을 의미하는지 합의가 되어 있기에 우리는 이것을 어떤 수치를 나타내는 표현이라고 받아들이고 계산에 취급하는 것입니다.

마찬가지로 11001110이라는 비트 표현이 있을 때, 이것을 부호없는 8비트 정수로 읽기로 한다는 규약이 있다면 206으로 취급합니다. 하지만 코드에서는 이를 부호있는 값으로 취급하겠다고 규정하였으므로 음수 -50으로 취급합니다.

2. 2의 보수를 쓰는 2진수 체계에서는 206을 표현하려면 최상위비트가 0이 아니어야 하므로 8비트보다 큰 자료형이 필요합니다. 주어진 코드에서는 int이므로 4바이트라고 가정하면

00000000 00000000 00000000 11001110

이렇게 되겠네요.

3. 2의 보수를 사용하는 것에 "왜"는 성립하지 않습니다. 필연적인 이유가 있어서 정한 것이 아니라, 편의상 정한 것이기 때문입니다. 과거 1의 보수를 사용한 컴퓨터 시스템도 있었으며, EBCBIC같은 체계와 같이 보수를 사용하지 않는 수표현도 쓰였습니다.

2의 보수가 편리한 점은, 정수 연산을 취급할 때 캐리를 무시하면 정해진 범위 안에서는 특별한 추가 연산이 필요 없었다는 점이 있습니다.

이를테면, 1과 -1을 더하면 0이 되어야 하는데, 1의 보수 체계를 쓴다면

0000 0001 + 1111 1110 = 1111 1111 이 되어서 0을 두개 정의하든가, 1111 1111이 결과로 나오면 0으로 대체한다든가 하는 처리가 필요합니다.

반면 2의 보수 체계를 쓴다면 1 + (-1)은

0000 0001 + 1111 1111 = 1 0000 0000이 되는데, 이때 자리올림된 최상위의 1은 캐리 비트로 메모리에서 읽을 때 무시하면 간단히 0000 0000이라는 결과를 얻을 수 있습니다.

추가로 질문하신, 50과 -50사이의 관계는, 1100 1110을 계산하기 위해 2의 보수를 써서 변환한다는 것 자체가 2의 보수가 성립하는 쌍끼리 최상위비트가 0인 쪽을 양수로 정한다는 약속 하에서 수치를 취급하겠다는 의미이기 때문입니다.

C언어 보수의 개념과 프로그래밍

... 그러는데, c언어보수의 개념이 뭐고 또 c언어 보수 프로그래밍을 어떻게 만들어야... 쉬운 개념인데 글로만 이해를 하려니 어려우시죠? 원래 처음배우는 건 다 어렵긴...

C언어 보수개념이랑 이진법에서...

보수개념이랑 컴퓨터에서 -값을 표현하는 방법은 이해를 했는데 이걸알아야하는 이유가 있나요?? 어차피 컴퓨터안에서 저장되고 할텐데 안에서 -값이 어떻게...

c언어 초보 질문이 있어요

... c언어를 배우고 있는 초보 학생입니다. int main() { char a = 127; //범위 -128~127 a = a + 1;... 이진수와 2의 보수 개념을 조금 이해해야 합니다. 2의 보수 - 위키백과, 우리 모두의...

c언어 ~연산자 질문

~10이 -11 이라는데, 도저히 이해가 안됩니다. 왜... 수 개념이 생기는거죠. 10 라고 했을 때 0000 0000 0000 0000 0000 0000 0000 1010 비트로 나뉘어지고, 보수...

저 지금 c언어 기초 배우고 잇거든요?...

제가 지금 c언어 배우고 있는데 뭐 2의보수 1의보수 연산자, c언어 문법 아스키코드... C언어는 프로그래밍의 기본 개념과 문법을 이해하는 데 도움이 되는 언어입니다. 자바는...

2의보수..

C언어에서 11110101에 1을 더하면 11110110이 된다는데 이유가 뭐죠?..이해가 안가요.. 보수의 개념을 보다 명확히 이해할 필요가 있겠네요. 1의 보수까지는 이해하셨죠?...

C언어 함수가 뭔지 잘 이해가 안가요

C언어 거의 처음 시작했는데.. 함수가 뭔지 개념이 도통 이해가 안 가요ㅠㅠ 1.함수가 무엇인지 2.함수를... 유지 보수가 더 쉬어지기 때문입니다. 2. 함수 호출은 main(){ plus...