설명 잘 들었습니다.
윈도우용 컴파일러인데
int는 2바이트, long 4바이트로 인식되고 있습니다.
16비트 모드로 돌아가고 있는 거 같은데 이건 왜 그럴까요?
중요한 건,
제시해주신 방법으로 해봤는데 여전히 안 된다는 겁니다.
printf에서 32767 이상의 수는 받아들여지지 않고 있는 거 같습니다.
3207*10은 되는데 3207*11은 딴 수가 나오는 걸로 봐서요.
지금 유일하게 되는 건
1500/100 을 15로 바로 넣어서
unsigned int 로 p를 선언한 후
p * 15 는 나옵니다.
이건 65534 범위 안에 있어서 그런 거 같습니다.(printf에서 %u로 하구요.)
p * 1500 / 100 이런 식으로 써야 하는데...
어떻게 해야 할런지요?
임문환.실업자 님이 쓰신 글 :
: 급해요 님이 쓰신 글 :
: : p는 int형입니다. sizeof를 해보니 크기가 2로 뜨네요. 2바이트인가 봅니다.
: :
: : int p= 3207;
: : printf ( " %d ", p*1500/100);
: :
: : 을 하는 건데요.(실제로는 p를 구하는 과정은 따로 있습니다.)
: : 계산 결사가 완전히 틀립니다. 옳게 하려면 어떻게 적어야 하는지 알려주세요.
: : int p 에 문제가 있나 해서 long으로도 바꿔봤는데 똑같습니다.
: : 결과값이 4만 단위로 나와야 하는데 263인가가 나옵니다-.-;
: : 그리고 p*15 로 적을 떄와 p*1500/100 로 적을 때 답이 서로 틀리더군요.
: : 그런 이유로 알려주시면 감사...^^
: : 그럼~
: :
:
: 곱셈과 나눗셈은 연산자 우선순위가 동일하고
: 명시적으로 우선순위를 변경(지정)해주지 않는 한 왼쪽에서 오른쪽으로 진행합니다.
: 따라서, p*1500/100 에서는 p*1500을 먼저 계산하고 그 결과에 100을 곱하게 됩니다.
: p가 3207이므로 3207*1500=4810500
: 4810500은 2바이트(16비트)에는 다 담을 수 없어서 LSB쪽 16 개 비트의 내용만 남습니다.
: (LSB쪽 16 개 비트의 값인 26372만 남음)
: 이 값을 100으로 나눕니다.
: 26372/100
: 정수형 간의 연산에는 결과도 정수형이고 나눗셈의 경우 소수점이하는 절사하므로 263이 결과값
:
: 그리고, long int 형은 4바이트 아니던가요? 이상하네요.
: 아래 두가지 중 하나로 하면 이상 없이 될겁니다.
: p*(1500.0/100.0);
: 또는
: p*(long)1500/100; //long이 2바이트라면 틀린 결과가 나옴.
:
: 그리고 printf 함수에서, unsigned로 표시하고 싶다면 형지정 문자에 u를 지정해주어야 합니다.
:
:
:
:
:
|