급합니다. 님이 쓰신 글 :
: 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 변수 값을 대입하더라도
우변항의 비트내용이 변경되어 좌변항에 대입되는 것은 아닙니다.
원래 비트 내용 그대로 좌변항에 저장됩니다.
|