Turbo-C
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
터보-C 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
Lua 게시판
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C/C++ Q/A
[2264] Re:또 질문입니다..... 2의보수 표현
임문환 [mhlim] 3315 읽음    2003-04-04 19:58
char b = 128;
일 때 b가 -128로 표시되는 것을 설명드리겠습니다.

char 형은 1바이트 크기입니다.
따라서,
unsigned char라면 0~255 의 수를 표현할 수 있습니다.
signed char라면 -128~127 의 수를 표현할 수 있습니다.

unsigned char의 경우 표현 가능한 최대치는 2진수로 11111111이고 10진수로 하면 255임

그러면 char b=128;일 때를 생각해봅시다.
128은 2의 7승이므로 8번째 비트만 1이고 나머지는 0입니다.
즉, 최상위 비트만 1입니다.
이것을 b에 저장하게 되고 또 실제로 b에는 그렇게 저장이 됩니다(비트 내용: 10000000).

b의 값을 출력할 때는 b가 signed인지 unsigned인지와는 상관 없이 signed로 출력하느냐 아니면 unsigned로 출력하느냐에 따라 출력결과가 다릅니다.
출력시,
unsigned로 출력하면 128이 출력됩니다.
signed의 경우 최상위 비트 값이 1이면 음수로 봅니다.
음수라면 2의 보수만들기의 역순으로 하여 출력할 값을 구합니다(양수인 경우는 unsigned일 때와 동일).
위 비트 내용(값)에서 1을 빼면 01111111 이 됩니다.
위의 결과에 대한 1의 보수를 구하면 10000000 이 됩니다.

즉, 애초에 최상위 비트가 1이었으므로 부호는 음수이고
절대치가 2진수로 10000000 인 -128이 출력되는 것입니다.


2의 보수 만들기:<

signed에서 음수를 저장할 때는 절대치의 2의 보수로 저장합니다.
2의 보수는 1의 보수에 1을 더한 것입니다.
1의 보수는 각 비트의 0은 1로 바꾸고 1은 0으로 바꾼 것입니다(즉, 비트 반전).
2의 보수는 위의 결과에 1을 더한 것입니다.

예:
char ch=-1;
-1의 절대치는 1
1의 보수는 11111110
2의 보수는 11111111(위 결과에 1을 더한 값)
이 값을 ch에 저장합니다.
ch의 비트 내용: 11111111

음수 값을 출력할 때는 2의 보수 만들기의 역순으로 출력할 값을 구합니다.
예:
위의 예에서 ch를 signed로 출력한다고 하면,
최상위 비트가 1이므로 음수이고 따라서 2의 보수로 표현된 값이므로 아래와 같이 출력할 값을 계산.
먼저 1을 빼면 11111110
위의 결과에 대한 1의 보수는 00000001

-1이 출력됨.

위는 컴터가 내부적으로 하는 것이고
아래와 같이 할 수도 있습니다.
1. 먼저 해당 자료형이 차지하는 bit수를 cb라 합시다(예; char 형은 8비트)
2. 음수 값이 담긴 변수(n)가 unsigned라 생각하고 그 값을 계산합니다(즉, unsigned로 캐스트; n2).
'2의 cb승 - n2'가 표시할 값의 절대치가 되고 부호는 음수입니다.

int cb=sizeof(char)*8;
int max=1;
char ch=-1;
unsigned char ch2,ab;

for(int i=1 ;i<=cb ;i++) max *= 2;
ch2 = (unsigned char)ch;
ab = max-ch;


김학래 님이 쓰신 글 :
: #include<stdio.h>
:
: main(void)
: {
:     char a = 127, b = 128;
:
:     printf("\n%d %d %d\n\n", a, a+1, b);
:     printf("\n%d %d %d\n\n", a, a+=1, b);
: }
:
: 여기서 결과가
:
: 첫번째  127   128   -128
: 두번째  -128  -128  -128
:
: 이라고 나오는데 왜 이렇게 나오는지 자세한 설명을 부탁드립니다....
:
: 그리고 매번 제 질문에 답변을 해주셔가 감사합니다...(__) 꾸벅

+ -

관련 글 리스트
2262 또 질문입니다..... 김학래 1072 2003/04/04
2264     Re:또 질문입니다..... 2의보수 표현 임문환 3315 2003/04/04
2263     Re:또 질문입니다..... 불사새 1208 2003/04/04
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.