C언어 초짜입니다 ..

hogil123의 이미지

매일 눈팅만 하다가 질문이 생겨서 확 가입해버렸네요 ㅎㅎ

소켓 프로그래밍 보던 도중에 궁금한점이 있어서 질문드려요

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]); 로 써도 출력이 잘 되야 맞는거 같은데 ..

어떤 부분을 잘못 이해하고 있는걸까요 ?

andai212의 이미지

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바이트를 정의하시면 될것 같습니다.

hogil123의 이미지

원래 소켓프로그래밍 책을 보던 도중에 char 배열에 4바이트 정수형을 넣다보니 저렇게 쓰더군요 ...

제 생각만으로는 int* tt = (int*)&buf[0]; 후에

printf("%d", *tt); 이것과
printf("%d", (int)buf[0]) 이것의 차이를 잘 모르겠네요 ..

같은 메모리 주소를 참조하고, 똑같이 int형으로 처리를 하는데

왜 전자는 되고, 후자는 안되는건가요 ?

정말 단순히 자료형의 차이일뿐이라 그런건가요 ?

peecky의 이미지

(int)buf[0]의 연산 순서는 [0]이 먼저고 그 다음이 (int)입니다.
그래서 어떤 의미가 되나면, buf[0]이 1바이트짜리 정수가 되고, 그 1바이트짜리 정수를 int 형으로 캐스팅하게 됩니다. 그래서 1바이트를 넘는 값을 가져올 수 없습니다.

ysun34의 이미지

printf("%d", *tt);
위의 tt는 int* 형이므로 *tt는 int형이 되어서 1바이트가 넘는 데이터를 담을 수 있고

printf("%d", (int)buf[0]);
위의 (int)buf[0]는 char형이므로 1바이트가 넘는 데이터를 담을 수 없기 때문 아닐까요?

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.