인프런 커뮤니티 질문&답변

김태수님의 프로필 이미지

작성한 질문수

독하게 시작하는 C 프로그래밍

비트연산자 뺄셈 구현에서 질문이 있습니다.

해결된 질문

23.11.23 18:03 작성

·

353

0

안녕하세요 선생님!

선생님 덕분에 재미있게 C를 공부하고 있습니다. 감사합니다.

다름이 아니고 비트연산자로 뺄셈을 구현할 때 약간 이해가 안 가는 점이 있어 질문을 드립니다.

 

	int a = 9, b = 6;
	printf("%d\n", a + (~b + 1));
	// 1001 + 1010 = 10011 ....???
	return 0;

10진수 9에서 10진수 6을 빼는 연산에서

6을 2진수로 치환한 후 부정을 걸어 1의 보수로 만들고 1을 더하면 1010이 되는 것으로 알고 있습니다.

여기에 10진수 9를 2진수로 치환한 1001을 더하면 10011이 됩니다.

그럼 답이 19가 되어야 하지 않을까 생각이 듭니다.

 

자리올림을 소거하면 0011로 3이 맞지만

그걸 따로 코딩을 안해준 상태에서는 19가 나와야하지 않나요?

혹시 C에서 자리올림을 알아서 소거해주는 걸까요? 아니면 제가 계산을 잘 못하고 있는 걸까요?

 

답변 주시면 너무 감사하겠습니다!

답변 2

2

Dongjoon Oh님의 프로필 이미지

2023. 11. 24. 13:28

1010이아니라

1111 1111 1111 1111 1111 1111 1111 1010이니까 그래요

더하면 자리수넘어감..

널널한 개발자님의 프로필 이미지
널널한 개발자
지식공유자

2023. 11. 25. 14:25

저 대신 답도 달아주셨네요. 고맙습니다. :)

김태수님의 프로필 이미지
김태수
질문자

2023. 11. 30. 22:34

감사합니다!! 동준님! ㅎㅎㅎ 열심히 공부하겠습니다

1

널널한 개발자님의 프로필 이미지
널널한 개발자
지식공유자

2023. 11. 25. 14:24

다른 분이 이미 저 대신 답변을 해주셨네요. 🙂

Dongjoon Oh님의 답변이 맞습니다. 한 가지 첨언하자면 32비트 정수형의 표현 범위를 넘어선 값에 대해서는 '잘림'처리 되어 버려집니다. 참고하시기 바랍니다.

 

김태수님의 프로필 이미지
김태수
질문자

2023. 11. 30. 22:35

넵 표현범위를 넘어서는 값에 대해서는 버려지게 된다는 점 잘 참고하겠습니다! ㅎㅎ 감사합니다!