프로그래밍

 3198, 1/160 회원가입  로그인  
   영원한공부
   [C언어] unsigned int a= -1; 이거 잘만 되네요.

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=2951 [복사]


unsigned int a = -1; 이런식으로 선언&초기화 하면 에러가 생길줄 알았는데

정상적으로 값이 들어가고 출력도 -1로 나오네요. 이게 왜 이러죠?

  Hit : 6043     Date : 2011/04/14 10:24



    
/x7375696e6567 예로
float i = 3.141592;
printf("%d",i);
라고하면 3만 출력되는것과 비슷합니다

+
unsigned int 형의 포맷스트링은
%u 입니다
2011/04/14  
clockmaker 출력은 아마 %d로 하셔서 -1이 나온 것 같고요.
윗분 말씀대로 해서 printf("%u \n", a);
를 쓰신다면 아마 4294967295 이 나올 겁니다.
이 값은 unsigned int의 MAX값에서 -1 한 값이죠 ㅇ_ㅇ
2011/04/15  
Prox uint 4294967295와 int -1 둘다, 저장될때 메모리에 들어가는 값은 0xFFFFFFFF 이구요..
이걸 윗분들말대로 %u로 출력하면 42억이, %d로 출력하면 -1이 나오게됩니다~

근데 아마 unsigned에 -1의 값을 넣을때 warning이 있을거같은데.. 아닌가요?

/x7375696e6567 // int형과 float형은 저장방식이 달라서 3이 안나와요 ㅎ
http://en.wikipedia.org/wiki/Single_precision
여기에서 볼수있는 복잡한(?) 공식에 의해 3.14가 저장되고..
그 2진수 값을 %d로 출력하면 아마 무지 큰 값이 나올겁니다
2011/04/15  
clockmaker Prox/ 해 봤는데요 gcc와 VS2010 모두 warning 나오지 않네요. 경고 정도는 띄워줘도 괜찮을 텐데 깔끔하게 컴파일 해 주는군요 ㄷㄷㄷ 2011/04/15  
영원한공부 아 정말 고맙습니다. 댓글 다 읽어보고 갑자기 확 이해됬어요. 감사합니다.

unsigned int a = -1; 을 하면 상수 1이 2의보수화 된 후에 a에 들어가니까

a = 11111111111111111111111111111111(2) 가 되서

%d = -1 , %u = 4294967295(unsigned int의 최댓값) 이 되는군요. %u를 잊고 있었어요 감사합니다
2011/04/15