생기초)자료형 값 질문 signed char x 에 대해, 비트의 개념에 대해

조회수 664회
int main ()
{
    unsighned char c = 0;
    c = 0;
    c = 255;

    signed char c1 = 0;
    c1 = 255;

    return 0;
    }

unsigned char c와 (signed) char c1, 이 두 가지가 수를 어디까지 표현할 수 있으며, 만약 표현할 수 있는 수가 초과되었을 때 컴퓨터는 어떻게 나올까? 라는 기초 배우고 있습니다.

다만, 선생님 강의에서는 c1 = 255; 의 값이 -1이 나오는 반면, 저는 빨간색 0으로 나옵니다. 이것이 첫 번째 질문. (사진 첨부가 안되네요..;;)

2번째 질문입니다. 위와 약간 연관이 되는 질문인데요.

    unsigned char c = 0;
    c=255;

이 부분은 8 bit로 28승으로 256가지 중 0을 포함한 255까지 표현할 수 있어서 값이 255로 도출되잖아요. 대충 ㅁㅁㅁㅁ/ㅁㅁㅁㅁ ㅁ가 1bit라고 하면 0000/0000 = 0 이고 0000/0001 = 1 2진법으로 표현되는 것이고. 1111/1111 = 255 가 되겠네요.

    signed char c1 = 0;
    c1 = 255;

위의 (signed) char c1은 양과 음을 포함한 8비트로. 0을 포함해 -128 ~ 127까지 셀 수 있는 c1입니다. 이 부분은 ㅁ/ㅁㅁㅁ/ㅁㅁㅁㅁ 첫 번째 ㅁ가 양과 음을 정하는 비트라서 0000/0000 = 0 0000/0001 = 1 1000/0000 = - 128

여기서 문제는 제가 c1 에 255를 대입한다면, 0111/1111이 최대일 텐데, 왜 1111/1111인 값인 -1이 도출될까요? 그저 위의 unsighned char c 처럼 1111/1111(255)의 비트값을 그대로 가져와서 그런가요? 그렇게 된다면 또 다른 초과하는 수인 128 값을 넣었을 때 unsigned char c 가 1000/0000 이니까

컴퓨터에서는 -128이 나오나요?

약간 이해가 될 듯 말듯하면서 이해가 안됩니다..

1 답변

  • 1) c1=255는 -1이 됩니다. 255의 하위 비트 8개인 1111 1111이 c1에 입력되어 -1이 됩니다.

    올려준 코드에도 unsighned에 오타가 있는 것을 보니 직접 돌린 코드를 올린 것이 아니고 타이핑 한것 같은데 0으로 나왔다는 코드 원본을 복사 붙여넣기로 올려보시길 바랍니다.

    2) 1111 1111이 -1이 되는 것은 컴퓨터는 음수를 구할 때 "2의 보수(two's complement)"를 취해서 음수를 구하기 때문입니다. 예를 들어 -1은 1에 2의 보수를 취해 만들고, -3은 3에 2의 보수를 취해 만듭니다. 1은 2진수로 0000 0001이고 2의 보수를 취하면 1111 1111이 됩니다. 그래서 1111 1111이 -1입니다. 2의 보수는 전체 비트를 반전시킨후 1을 더해서 얻습니다. 1을 반전하여 1111 1110이 얻어지고 여기에 1을 더해서 1111 1111이 얻어진 것입니다. 이것은 1의 2의 보수이고 이것을 1의 음수값(-1)으로 정의한 것입니다.

    2의 보수에 대해서는 아래 링크 읽어보세요.

    https://ko.wikipedia.org/wiki/2%EC%9D%98_%EB%B3%B4%EC%88%98

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • int main() { // unsigned 1 바이트로 양수만 표현함. // 256가지 -> 0 ~ 255 unsigned char c = 0; c = 0; c = -1; signed char c1 = 0; c1 = 255; return 0; } C++입문러 2023.12.12 23:35
    • 아 2번째 질문은 보수에 대한 질문은 아닙니다. 그저 값이 signed과 unsigned에서의 값이 상이하게 다르게 나와서 그렇습니다. 제가 2시간동안 나름 조사해본 결과 나침판의 침이나, 순환하는 삼각함수처럼, signed에서 대입하는 수가 표현할 수 있는 수보다 클 때, 순환하게 되어서 그런 것 같습니다. C++입문러 2023.12.12 23:42
    • f10을 눌러서 하나씩 진행할때 화살표가 위치하는 곳은 아직 진행이 안된, 이번에 진행이 될 차례의 값을 뜻합니다. 따라서 f10을 한번 더 눌러서 다음 줄로 가야지 c가 -1로 바뀐 것을 볼 수 있습니다. 알 수 없는 사용자 2023.12.12 23:52
    • 2)번 답변은 보수에 대해서 말하고자 한 것이 아니고 질문에서 "제가 c1 에 255를 대입한다면, 0111/1111이 최대일 텐데, 왜 1111/1111인 값인 -1이 도출될까요? "에 대해서 답변한 것입니다. 255가 1111 1111이고 이것이 1의 2의 보수, 즉 -1입니다. 알 수 없는 사용자 2023.12.12 23:56
    • 와.. 정말 감사합니다 구세주십니다. -1 값이 드디어 나왔습니다!! 이 가르침을 잊지 않고 정진하겠습니다. 감사합니다. C++입문러 2023.12.13 14:53

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)