강의실/정보영재

다음 프로그램의 출력결과는 무엇인가?


 

int x = 'A' + 128;

x += 129;

printf("%c\n", x);



정답은 B입니다.


저희 아이들 대부분 정답 없음을 선택했네요...ㅠ.ㅠ


실제로 아스키값은 0~255 까지 나오는 것을 알고 있어서..

'A'의 아스키값이 65 이니까 x = 65 + 128 + 129 = 322 가 나와서 아스키값 범위를 넘어 가기 때문에 정답 없음을 선택 했는데요...ㅠ.ㅠ


위와 같은 코드는 시리얼 통신 프로그래밍에서 데이터가 깨졌는지 안깨졌는지 확인하기 위해 마지막 데이터에 체크썸을 두는데 이때 사용하는 체크썸을 구할 때 많이 사용하는 프로그래밍 기법이네요.


일반적으로 체크썸은 데이터 패킷을 모두 합 한 다음에 1바이트로 변환해서 체크썸을 두는 경우가 많거든요.


원리는 다음과 같습니다.


x는 int 타입이기 때문에 4byte 입니다.


따라서 322는 이진수로 바꾸면 

|0000|0000|0000|0000|0000|0001|0100|0010|

위와 같이 32bit로 표현될수 있습니다.

이것을 char 타입으로 변환하면 1byte만 사용하기 때문에 주황색 부분인 |0100|0010| 이부분만 가져 오게 됩니다.


따라서 이것을 10진수값으로 표현하면 66 이고 이것을 ASCII 값으로 변환하면 'B' 가 되는 것입니다.


결국은 322 % 256 = 66 의 값을 얻게 되는 것입니다.




정보올림피아드 문제 풀이 리스트 정리



이 장소를 Daum지도에서 확인해보세요.
인천 서구 당하동 1028-2 장원프라자 502호 | 원당컴퓨터학원
도움말 Daum 지도
3 0
  • 휴식같은 친구 2018.04.18 12:44 신고    

    정보올림피아드 수준이 꽤 높은것 같네요.
    전산전공인 저도...ㅠ
    어느학년 수준인지 궁금합니다.ㅎ

  • 핑구야 날자 2018.04.19 06:42 신고    

    올림피아드를 준비하는 분들에게 도움이 많이 되겠어요

  • 버블프라이스 2018.04.28 21:16 신고    

    2018년 정보올림피아드 지역대회 초등부 17번 문제 풀이를 해주셔서 해당 시험을 준비하는 학생분들이게 많은 도움이 될 것 같습니다.
    이 글을 읽은 학생분들은 시험에서 좋은 결과 있길 바랍니다