"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > fmt.Printf가 2의 보수로 표현된 부호 있는 정수에 대해 \"-101\"을 출력하는 이유는 무엇입니까?

fmt.Printf가 2의 보수로 표현된 부호 있는 정수에 대해 \"-101\"을 출력하는 이유는 무엇입니까?

2024년 11월 13일에 게시됨
검색:639

Why Does fmt.Printf Output \

2의 보수 및 fmt.Printf 이진 출력

컴퓨터가 2의 보수를 사용하여 부호 있는 정수를 나타낼 때 -5와 같은 값은 다음과 같이 저장됩니다. 비트 패턴 "1111 1011" 그러나 다음과 같이 fmt.Printf를 사용하여 이 이진 표현을 인쇄하려고 하면:

var i int8 = -5
fmt.Printf("%b", i)

출력에 예기치 않게 "-101"이 표시됩니다. 왜 이런 일이 발생하며, Two의 보수가 내부적으로 사용됩니까?

이진 형식 문제

불일치는 fmt.Printf가 이진 형식을 처리하는 방식에 있습니다. 음수 부호 있는 정수의 형식을 지정하면 이를 양수 값으로 변환한 다음 형식이 지정된 문자열 앞에 '-' 기호를 추가합니다.

fmt.Printf의 소스 코드를 살펴보면 fmt.integer가 다음과 같이 변환하는 것을 알 수 있습니다. 서식을 지정하기 전에 부호 있는 정수를 양수 값으로 변환합니다.

    negative := signedness == signed && a 

서명되지 않은 출력과 서명된 출력

이를 설명하려면 다음 코드를 고려하세요.

var u uint8 = uint(i)
fmt.Printf("%b", u)

여기서 i를 인쇄하기 전에 부호 없는 정수로 변환합니다. 이번에는 출력에 -5의 2의 보수인 "11111011"이 올바르게 표시됩니다.

결론

다음을 사용하여 부호 있는 정수의 이진 표현을 올바르게 인쇄하려면 fmt.Printf의 경우 먼저 부호 없는 유형을 사용하여 이를 양의 정수로 변환해야 합니다. 이렇게 하면 fmt.Printf가 자동으로 값을 음수 값으로 변환하지 않고 '-' 기호를 추가하지 않게 됩니다.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3