Go에서 fmt.Printf가 부호 있는 정수에 대해 잘못된 이진 표현을 표시하는 이유는 무엇입니까?

Susan Sarandon
풀어 주다: 2024-11-03 11:29:29
원래의
214명이 탐색했습니다.

Why Does fmt.Printf Display Incorrect Binary Representations for Signed Integers in Go?

2의 보수와 fmt.Printf의 불일치

원래 질문:

2진 표현을 인쇄하려고 할 때 부호 있는 정수인 fmt.Printf는 예상되는 2의 보수와 다른 출력을 생성합니다. value.

분석:

2의 보수는 컴퓨터가 내부적으로 부호 있는 정수를 표현하는 데 사용하는 기술입니다. 예를 들어, -5는 1111 1011로 표시됩니다. 그러나 fmt.Printf를 부호 있는 정수와 함께 사용하면 예상치 못한 결과가 발생합니다. 그러나 부호 없는 정수로 변환하면 올바른 이진 표현이 생성됩니다.

설명:

관찰된 동작은 정수의 내부 표현으로 인한 것이 아닙니다. 이는 fmt.Printf가 이진수 형식을 지정하는 방법에 따른 결과입니다.

fmt.Printf에서 활용하는 fmt.integer 함수는 형식 지정 전에 음수 부호 있는 정수를 양수 값으로 변환합니다. 그러면 절대값의 이진값 앞에 - 기호가 추가됩니다.

예:

<code class="go">var i int8 = -5
fmt.Printf("%b", i) // Outputs: -101 (Incorrect)</code>
로그인 후 복사

이 예에서 -5는 5로 변환됩니다. 이진수로 앞에 .가 추가되어 결과는 다음과 같습니다. -101.

해결 방법:

부호 있는 정수의 올바른 이진 표현을 얻으려면 이를 부호 없는 정수로 변환한 다음 fmt.Printf를 사용하여 인쇄할 수 있습니다. 이진 표현.

<code class="go">var i int8 = -5
var u uint8 = uint8(i)
fmt.Printf("%b", u) // Outputs: 1111 1011 (Correct)</code>
로그인 후 복사

위 내용은 Go에서 fmt.Printf가 부호 있는 정수에 대해 잘못된 이진 표현을 표시하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿