C언어 & 파이썬/C언어 2012. 11. 12. 07:56

음의 정수, 양의정수 표현하기 문제.



휘갈겨써서...대략난감으로 지저분하다.;;

여튼 마지막 음의정수 11110000를 10진수로 풀이하는것은 틀렸다;;; 음..지식인에 질문을 올렸으니 그거보면 이해가 될듯.

아..답이 왜저렇게 나왔지... 그리고 0은 1로 0은 1로바꿔줘야 하는데 저건 왜 저런가?


- 해결!

2의 보수법에 의해 +1을 더해주는데 11110000를 음의정수 변환할때 00001111라는 답이 나오는데 이때 +1을 해주어야 한다.

그러면 11다음은 0이니까( 2진법생각 0, 1, 10, 11) 00010000이라는 답이나오는것이다.!


http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=161587545


자세한 방법과 다른방법이 설명되어있다. 출처는 지식인 질문자는 나.

C언어 & 파이썬/C언어 2012. 11. 12. 07:29

2의 보수법.

출처 http://gcstudy.tistory.com/16


1. 처음 2진수로 음의 정수를 표현하고자 했던 방식은 최상위 비트를 부호 비트로 두는 것이었습니다.
(최상위 비트가 1 이면 음수, 0 이면 양수)



그림과 같이 +1 과 -1 은 최상위 비트가 0 과 1 로 구별됩니다.

이 방식의 문제점은 0 을 표현하는 데 있어서

00000000
10000000



이렇게 +0 , -0 두 개의 표현이 나오게 된다는 것과
두 수의 부호가 같은지 다른지 등을 구별해서 가산기 로직을 탈 것인지,
감산기 로직을 탈 것인지를 판별하는 등 연산이 복잡해진다는 것입니다.
예를 들어,
(+1) + (-1) 은
0000001 + 10000001 로 표현되는데, 이것을 그대로 더하면 100000010 (-2) 라는 결과가 되버립니다.
그리고 값의 크기 비교도 부호에 따라 판별을 달리해야하는 모순이 생깁니다.
인간의 관점에서는 당연스럽지만 기계에 있어서는 일관된 법칙을 적용하기가 힘들어지는 방식입니다. 


2. 그래서 이 다음으로 나온 방식이 1의 보수법입니다.
1의 보수법에서 음수의 표현은 단순히 해당 수의 각 비트를 반전 시키는 것입니다.
 



1의 보수법은 단순히 비트를 반전시키는 것이기 때문에 부호 처리가 매우 쉬워졌습니다.
음수에 대한 비교 연산 역시 일관성을 갖게 되었습니다.

11111101 > 11111100     -2  > -3 

하지만, 1의 보수법도 여전히 0 의 표현이 두 가지로 존재하고 계산 과정에서
캐리를 감지해서 LSB(최하위 비트)에 더해주는 작업이 필요합니다.

예를 들어,
(-2) + (-3) 은 다음과 같이 되는데


이것을 그대로 사용하게 되면 -6 의 값이 되지만
캐리가 발생하였으므로 LSB 에 1을 더해서 다음과 같이 처리하게 됩니다.
(캐리 발생은 8086 계열의 CPU 의 경우 flag register 의 0번 비트를 보고 판별합니다.)


3. 1의 보수법 다음으로 1의 보수법이 가진 문제점이 개선되어 나온 것이 2의 보수법 입니다.
2의 보수법은 1의 보수를 취한 후에 단순히 1을 더해줌으로써 음수를 표현합니다.

(-2) + (-3)



0 의 표현



C언어 & 파이썬/C언어 2012. 11. 12. 07:19

10진수 16진수 8진수를 이용한 덧셈 뺄셈연산.



C언어 & 파이썬/C언어 2012. 11. 12. 06:51

byte를 10진수로(이해도움을 위한 글)

2진수를 이해하면 되겠습니다.


0 (0)
1 (1)
10 (2)  - 한자리 위의 값은 2가 됩니다.
11 (3)  -  2+1
100 (4) - 두자리 위의 값은 4
101 (5) - 4+1
110 (6) - 4+2
111 (7) - 4+2+1
1000 (8) -  3자리 위의 값은 8
1001 (9) - 8+1
1010 (10) - 8+2
1011 (11) - 8+2+1
1100 (12) - 8+4
1101 (13) - 8+4+1
1110 (14) - 8+4+2
1111 (15) - 8+4+2+1
10000 (16) - 16
10001 (17) - 16+1
10010 (18) - 16+2
10011 (19) - 16+2+1
................

이때  바이트는 8비트 이니까 앞부분도 모두 표현해주면 (0으로 채워진 부분) 
다음과 같습니다.

00000000 (0)
00000001 (1)
00000010 (2)
00000011 (3)
00000100 (4)
00000101 (5)
00000110 (6)
00000111 (7)
00001000 (8)
00001001 (9)
00001010 (10)
00001011 (11)
00001100 (12)

내가 질문했기때문에 그냥 퍼옴. 네이버 지식인 출처.

C언어 & 파이썬/C언어 2012. 11. 9. 10:05

진수와 비트, 비트바이트정리.

다이어리에 정리 요약.

이제 버스타고갈때든 시간날때마다 보면서 외워야지지지

역시...이런건 컴퓨터로 쓰는것보단 아날로그적! 손으로쓰는게 더편하고 이렇게 필기해놓으면 더기억하기 쉽다.