C언어에서 형이 다른 변수들끼리의 연산에 대해 질문있습니다.
글쓴이: dingkyu / 작성시간: 목, 2007/11/29 - 9:42오전
C에서 프로그래밍을 할때 다음과 같은 조건으로 연산을 했습니다만,
왜 기대한 대로 결과가 나오지 않는지 도무지 이해를 못해서
질문글 올립니다.
unsigned int A = 100;
unsigned int B = 200;
int C = 10;
if((C + A) - B < 0) {
분기 1 ;
}
else {
분기 2 ;
}
위의 코드대로라면 분명 "분기 1"로 갈꺼 같은데
printf("(C + A) - B = %d\n", (C + A) - B);
로 결과가 - 값이 나오는데도 불구하고 분기 1로는
들어가질 않네요.
이거 왜 그런건지 간단히 설명이나 검색키워드라도
가르쳐주세요. -_ㅠa
Forums:
unsigned int와 int 간의
unsigned int와 int 간의 연산에서는
연산전에 int가 unsigned int로 conversion됩니다.
Arithmetic conversion을 찾아보시면 되겠습니다.
unsigned int t = (C+(unsigned int)A)-B;
if (t<0) 인가를 테스트하므로 당연히
unsigned int t는 0보다 크겠지요..
윗분이 잘 설명해주셨네요.
컨버전은 문법책을 꼼꼼히 읽어보면 나오는 부분이기는 하지만, 읽었다고 하더라도 실제로 저런 문제에 부딪히기 전까지는 잘 알 수 없는 부분이기도 합니다.
저 부분이 어렵다고 생각한다면, 모든 계산을 long int나 double로 변환한 다음, 계산을 수행하는 버릇을 들이면 굳이 큰 고민없이도 프로그래밍 할 수 있습니다. 물론, 가능한 값이 long int나 double의 범위를 벗어나지 않는지는 확실히 인지하고 있어야 합니다.
하지만 하드웨어에 의존적인 프로그래밍을 하실 거라면, 저런 부분은 허투루 넘겨서는 안됩니다. 문법책과 컴파일러 메뉴얼, 심지어는 C언어 스팩까지도 꼼꼼히 읽으셔야 합니다.
------------------------------
How many legs does a dog have?
------------------------------
How many legs does a dog have?
답변 감사합니다.
auditory님, semmal님 답변 감사드립니다.
덕분에 명확하게 알게됬습니다.
(-_-) (_ _) (^_^)꾸벅..
고민이 많아 고민인 애늙은이 입니다.
unsigned는 최대한 자제해야 합니다.
unsigned의 modulo 연산을 이용하는거나 비트 단위 연산이 필요한게 아니라면
무조건 signed int로 하는게 좋습니다.
양수값만 들어간다고해도 signed로 문제가 없다면 signed로 하는게 좋죠
:)
댓글 달기