unsigned int에 char 할당하기
글쓴이: goatee98 / 작성시간: 수, 2006/02/15 - 9:45오후
unsigned int형 변수에 char형 변수를 할당하면 unsigned int 변수가 singend int로 동작을 합니다.
int 타입이 사이즈도 더 크고 유형 승급이니 뭐니 따져도 unsigned 타입으로 할당이 되어야 할것 같은데 왜 signed 로 변경 되는지 이해를 못하겠네요??
좀 더 황당한것은 unsigned short형에 char타입을 할당하면 unsigned로 할당 된다는것인데.. 고수님들의 조언을 부탁드립니다.
int main(int argc, char **argv) { unsigned int i = 0; unsigned short s = 0; char c = 0xFF; i = c; s = c; printf("i = %d\n", i); printf("s = %d\n", s); return 0; }
실행결과
i = -1
s = 65535
실행환경
RedHat Linux 9, Intel CPU, gcc 3.2.2
컴파일(Optimize 없음)
gcc -o a a.c
Forums:
char 가 signed 이므로,char c = 0xff;
char 가 signed 이므로,
char c = 0xff;
는
char c = -1;
과 동일합니다.
그렇다면 나머지 결과는 수긍할만 상황으로 보입니다만..
( c 의 표준은 떠나서, 일반적 상황을 말하는 겁니다.. 표준으로 따지면, 저런 대입에 대한 결과는 예측 불능일 껍니다. char 가 8bit 라고 정해지지 않았으니까요.. )
[code:1]int main(int argc, char **
---------
간디가 말한 우리를 파괴시키는 7가지 요소
첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스
이익추구를 위해서라면..
다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치
printf 함수에서 unsigned형 변수를 %d로 출력해서 그렇습니다
printf 함수에서 unsigned형 변수를 %d로 출력해서 그렇습니다. %u 혹은 %x로 출력해야 제대로 unsigned형으로 나옵니다.
타입케스팅 없이 대입을 해도 왜 컴파일때 경고가 없나요? -Wall 옵션
타입케스팅 없이 대입을 해도 왜 컴파일때 경고가 없나요? -Wall 옵션을 넣어서 해도 안나오네요.
<- 이거면 안 되는 게 없어~
정품 소프트웨어 사용 캠패인
추가 질문입니다..
그냥 생각하기엔
char a = 0xFF, 일걸 unsigned 값으로 하면 255 이지 않습니까? 그래서, 요 a 란 녀석을 unsigned int로 할당하면 255 가 할당 되어야 하지 않나 생각이 들어서요
char a = 0xFF;
unsigned int b = char a; // <- 여기서 형변환이 일어나는게 아닌지??
integer conversion, integer promotion 이런것 때문인가요??
char type은 unsigned일 수도 있고, signed일 수도 있
char type은 unsigned일 수도 있고, signed일 수도 있습니다. 그리고 원 문제의 답은 앞 손님이 남기신 글이 정답입니다. printf에서 format specifier를 잘 못 썼기 때문이지, unsigned가 signed로 맘대로 바뀌어지는 것이 아닙니다.
char가 몇 비트인지는 <limits.h>의 CHAR_BIT 매크로로 알 수 있습니다.
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
타입캐스팅
저 코드에 나오는 타입들은 다 numeric 타입들인데 데이터 손실이 일어나지 않는다면 implicit typecast가 됩니다. 작은 type에서 큰 type으로 대입을 하니까 아무 문제가 발생하지 않지요..
블로그: http://turtleforward.blogspot.com
댓글 달기