C언어 초짜입니다 ..
글쓴이: hogil123 / 작성시간: 수, 2015/07/15 - 6:57오전
매일 눈팅만 하다가 질문이 생겨서 확 가입해버렸네요 ㅎㅎ
소켓 프로그래밍 보던 도중에 궁금한점이 있어서 질문드려요
char형 배열에 int형 정수를 집어 넣어야 합니다 .
그래서
char buf[10];
scanf("%d", (int*)&buf[0]);
buf[0] 에 int형 정수를 집어 넣습니다 .
그 후에 정수를 다시 꺼낼때
printf("%d", buf[0]);
127까지는 출력이 잘 됩니다만 , 128부터는 char 형 출력하듯이 1바이트 기준으로(char형) 값이 나오는거 같더군요 ..
( 128 입력시 -128 출력 됨 )
int* tt = &buf[0];
printf("%d", *tt);
이렇게 주소를 넘겨주고 나서 출력시에는 출력이 잘 됩니다만 ...
제 생각으로는
printf("%d", (int)buf[0]); 로 써도 출력이 잘 되야 맞는거 같은데 ..
어떤 부분을 잘못 이해하고 있는걸까요 ?
Forums:
적절한 자료형을 사용하셔야.~
char 1바이트 자료형입니다. 그래서 표현되는 -128 ~ 127까지만 표현되는게 한계입니다.
unsigned char 인 경우는 음의 정수를 제외한 0 ~ 255 까지만 표현 되고요.
그래서 처음에 결과과 님처럼 그렇게 나온 걸 꺼고요.
아래에 int* tt = &buf[0] 에서 *tt 는 이미 buf[0] ~ buf[3] 까지 영역으로 할당됩니다.
int 는 기본 워드 (4바이트) 단위 자료형이기 때문에 buf[3] 까지 포함하게 됩니다.
즉, *tt = 50000; 입력하면 기존 데이터는 지워지고 buf[0] = 0x50, buf[1] = 0xC3, buf[2] = 0x00, buf[3] = 0x00 이 입력되죠.(little endian)
솔직히 int* tt = &buf[0]; 형이 맞지 않기 때문에 warning 이 발생합니다. int* tt = (int*)&buf[0] 으로 표현 하셔야 합니다.
음.. 단순 buf 배열에 하나의 정수만 넣을 실려면 위와 같이 표현하면 되고요.
각 버퍼에 다른 정수를 각각 넣고 싶으시다면 char buf 가 아닌 int buf 를 쓰셔야 겠죠.
버퍼크기는 정수 자료형 int 면 4바이트 long 이면 8바이트를 정의하시면 될것 같습니다.
답글 감사합니다 .
원래 소켓프로그래밍 책을 보던 도중에 char 배열에 4바이트 정수형을 넣다보니 저렇게 쓰더군요 ...
제 생각만으로는 int* tt = (int*)&buf[0]; 후에
printf("%d", *tt); 이것과
printf("%d", (int)buf[0]) 이것의 차이를 잘 모르겠네요 ..
같은 메모리 주소를 참조하고, 똑같이 int형으로 처리를 하는데
왜 전자는 되고, 후자는 안되는건가요 ?
정말 단순히 자료형의 차이일뿐이라 그런건가요 ?
(int)buf[0]의 연산 순서는 [0]이 먼저고
(int)buf[0]의 연산 순서는 [0]이 먼저고 그 다음이 (int)입니다.
그래서 어떤 의미가 되나면, buf[0]이 1바이트짜리 정수가 되고, 그 1바이트짜리 정수를 int 형으로 캐스팅하게 됩니다. 그래서 1바이트를 넘는 값을 가져올 수 없습니다.
제가 아는 범위내로는..
printf("%d", *tt);
위의 tt는 int* 형이므로 *tt는 int형이 되어서 1바이트가 넘는 데이터를 담을 수 있고
printf("%d", (int)buf[0]);
위의 (int)buf[0]는 char형이므로 1바이트가 넘는 데이터를 담을 수 없기 때문 아닐까요?
댓글 달기