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

C/C++ Q/A
[2765] Re: 정수형 간의 연산
임문환.실업자 [] 1267 읽음    2003-06-15 07:47
급합니다. 님이 쓰신 글 :
: P 라는 변수에는 3000정도의 수가 들어 있습니다.
:
: 거기에 1000을 곱했더니
:
: 그러니까..
:
: printf(" %d" , p * 1000 );
:
: 이상한 마이너스의 숫자가 나옵니다.
:
: printf 내에서 %d 로 정수를 표현할 때 단위에 걸리는 건가요??
: 제가 잘못 쓴건가요???
: 답이 틀리거든요.
:


P의 자료형이 무엇인가요?
P의 자료형에 따라 결과가 달라집니다.
정확히 말하자면, 부호 있는 형인지 여부와 자료형의 크기가 동시에 작용하여 결과가 달라집니다.

일단 P에 대입하려는 값이 대략 3000(천단위라는 것만 인정) 이고 곱한 값은 정확이 1000인 것으로 보겠습니다.
P가 int 형이고 int 형이 32비트라면 p의 signed 여부와는 상관 없이 저 결과는 절대 음수가 나오지 않습니다.
P가 int 형이긴 하지만 int 형이 16비트라면 p의 signed 여부와는 상관 없이 저 결과는 음수가 나올 수 있습니다.
P가 signed char 형이라면 int 형의 크기와 상관 없이 저 결과는 음수가 나올 수 있습니다.
P가 unsigned char 형이고 int 형 크기가 16비트라면 저 결과는 음수가 나올 수 있습니다.


요는 이것입니다.
정수형인 경우(즉, 기본형 중에서 실수형이 아닌 경우)
1. 부호 있는 형이고 해당 자료형의 비트수가 N이라면  -2^N/2 ~ 2^N/2-1 의 수를 표시할 수 있음.
2. 부호 없는 형이고 해당 자료형의 비트수가 N이라면  0 ~ 2^N-1 의 수를 표시할 수 있음.
3. 1,2 모두 연산의 결과 또는 대입하는 값이 자료형의 비트수를 넘게 되면 자료형의 비트수 만큼의 LSB쪽 비트만 최종 결과로 남습니다.(예: char c=257; c에는 1이 대입됨, 257==0x0101)
돌려서 생각해보면 남는 비트의 값은 '대입하려는 값을 2^N으로 나눌 때의 나머지'가 됩니다.
3-1. 부호 있는 형인 경우 이 최종 결과로 부호가 결정됨
눈으로 보기엔 양수를 대입한 경우에도 1에 따라 음수가 될 수도 있음(예: char c=129; c의 값은 -127, 129는 2진수로 10000001, 최상위비트가 1이므로 음수이고 2의보수이므로 절대치는 127).

자료형의 크기가 작은 것과 큰 것 간에 연산을 하려 하면 큰 쪽으로 형을 통일한 후 연산합니다.
그리고, printf와 같은 출력 함수에서는 변수형의 signed 여부와 상관 없이 출력형지정자와 변수에 담긴 값의 크기에 따라 부호가 달라질 수 있습니다.

char는 1바이트(8비트)이므로
signed라면 -2^8/2 ~ 2^8/2-1 즉 -128~127의 수 표현 가능
unsigned 라면 0~2^8-1 즉 0~255의 수 표현 가능

int가 2바이트(16비트)인 경우
signed라면 -2^16/2 ~ 2^16/2-1 즉 -32768~32767의 수 표현 가능
unsigned 라면 0~2^16-1 즉 0~65535의 수 표현 가능


int가 4바이트(32비트)인 경우
signed라면 -2^32/2 ~ 2^32/2-1 즉 -2147483648~2147483647의 수 표현 가능
unsigned 라면 0~2^32-1 즉 0~4294967295의 수 표현 가능


동일한 크기의 정수형 변수에서
signed 변수에 unsigned 변수 값을 대입하거나
unsigned 변수에 signed 변수 값을 대입하더라도
우변항의 비트내용이 변경되어 좌변항에 대입되는 것은 아닙니다.
원래 비트 내용 그대로 좌변항에 저장됩니다.



+ -

관련 글 리스트
2764 급합니다. 쉬운 건데 틀리네요. 단순 질문입니다. 급합니다. 1145 2003/06/15
2765     Re: 정수형 간의 연산 임문환.실업자 1267 2003/06/15
2766         Re:Re: 답변 감사드리구요. 다시 좀 봐주세요. 급해요 1095 2003/06/15
2768             Re:Re:Re: 정수형 간의 연산 임문환.실업자 1156 2003/06/15
2770                 Re:Re:Re:Re: 이런 여전히 안 됩니다...ㅡ.ㅡ; 급합니다. 1030 2003/06/15
2771                     Re:Re:Re:Re:Re: 이런 여전히 안 됩니다...ㅡ.ㅡ; 임문환.실업자 1144 2003/06/15
2772                         Re:Re:Re:Re:Re:Re: 됩니다~! 급합니다. 1098 2003/06/15
2773                             Re:Re:Re:Re:Re:Re:Re: 됩니다~! 임문환.실업자 1233 2003/06/15
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.