unsigned int에 char 할당하기

goatee98의 이미지

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

hyperhidrosis의 이미지

char 가 signed 이므로,

char c = 0xff;

char c = -1;

과 동일합니다.

그렇다면 나머지 결과는 수긍할만 상황으로 보입니다만..

( c 의 표준은 떠나서, 일반적 상황을 말하는 겁니다.. 표준으로 따지면, 저런 대입에 대한 결과는 예측 불능일 껍니다. char 가 8bit 라고 정해지지 않았으니까요.. )

IsExist의 이미지

int main(int argc, char **argv)
{
    unsigned int i;
    unsigned short s = 0;
    char c = 0xFF;

    i = (unsigned char)c;
    s = c;
    printf("i = %08x\n", i);
    printf("s = %08x\n", s);

    i = (short)s;
    printf("i = %08x\n", i);
    i = s;
    printf("i = %08x\n", i);

    return 0;
}

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

익명 사용자의 이미지

printf 함수에서 unsigned형 변수를 %d로 출력해서 그렇습니다. %u 혹은 %x로 출력해야 제대로 unsigned형으로 나옵니다.

moonhyunjin의 이미지

타입케스팅 없이 대입을 해도 왜 컴파일때 경고가 없나요? -Wall 옵션을 넣어서 해도 안나오네요.

<- 이거면 안 되는 게 없어~
정품 소프트웨어 사용 캠패인

goatee98의 이미지

그냥 생각하기엔
char a = 0xFF, 일걸 unsigned 값으로 하면 255 이지 않습니까? 그래서, 요 a 란 녀석을 unsigned int로 할당하면 255 가 할당 되어야 하지 않나 생각이 들어서요

char a = 0xFF;
unsigned int b = char a; // <- 여기서 형변환이 일어나는게 아닌지??

integer conversion, integer promotion 이런것 때문인가요??

cinsk의 이미지

char type은 unsigned일 수도 있고, signed일 수도 있습니다. 그리고 원 문제의 답은 앞 손님이 남기신 글이 정답입니다. printf에서 format specifier를 잘 못 썼기 때문이지, unsigned가 signed로 맘대로 바뀌어지는 것이 아닙니다.

char가 몇 비트인지는 <limits.h>의 CHAR_BIT 매크로로 알 수 있습니다.

only2sea의 이미지

moonhyunjin wrote:
타입케스팅 없이 대입을 해도 왜 컴파일때 경고가 없나요? -Wall 옵션을 넣어서 해도 안나오네요.

저 코드에 나오는 타입들은 다 numeric 타입들인데 데이터 손실이 일어나지 않는다면 implicit typecast가 됩니다. 작은 type에서 큰 type으로 대입을 하니까 아무 문제가 발생하지 않지요..

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.