음냐...이런 것이 바로 기본기 부족인가....
int i= -1; printf("i = %d \n", i); 는 당연히 i = -1 인데
char c= -1; printf("c = %d \n", c); 는 c = 255인 이유가 머죠?
pc에서 음수는 2의 보수로 표현됩니다. char는 1byte이므로 -1은 1111 1111이 됩니다.
그런데 printf의 %d 는 프린트할 값을 int(2또는4byte)로 간주합니다. 그러므로 char가 int로 변경(promoted)되어 그 값을 print합니다. 그러므로 1111 1111 (1 byte) -> 0000 0000 1111 1111 (2byte)로 변경되므로 255가 찍힙니다. int i = -1; (2byte로가정)일 때 i의 값은 1111 1111 1111 1111이 됩니다.
실제 프로모션을 취하면 Signed 와 Unsigned 는 틀린 방식으로 프로모션 을 합니다.
님이 말한건 Unsigned 일경우의 프로모션이구여....,
printf 의 문제는 stack 에서 data 를 가져올때 format 의 size 만큼 가 져오기 때문에 생기는 문제가 아닌가 싶네여....
텍스트 포맷에 대한 자세한 정보
<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]
Re: 쩝~ char
pc에서 음수는 2의 보수로 표현됩니다.
char는 1byte이므로 -1은 1111 1111이 됩니다.
그런데 printf의 %d 는 프린트할 값을 int(2또는4byte)로 간주합니다.
그러므로 char가 int로 변경(promoted)되어 그 값을 print합니다.
그러므로 1111 1111 (1 byte) -> 0000 0000 1111 1111 (2byte)로
변경되므로 255가 찍힙니다.
int i = -1; (2byte로가정)일 때 i의 값은
1111 1111 1111 1111이 됩니다.
포로모션의 문제는 아닐듯....
실제 프로모션을 취하면 Signed 와 Unsigned 는 틀린 방식으로 프로모션
을 합니다.
님이 말한건 Unsigned 일경우의 프로모션이구여....,
printf 의 문제는 stack 에서 data 를 가져올때 format 의 size 만큼 가
져오기 때문에 생기는 문제가 아닌가 싶네여....
댓글 달기