>백엔드 개발 >Golang >Go와 C에서 -1을 16진수로 인쇄하면 왜 다른 결과가 나오나요?

Go와 C에서 -1을 16진수로 인쇄하면 왜 다른 결과가 나오나요?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-16 00:58:03242검색

Why does printing -1 as hexadecimal in Go and C produce different results?

Go와 C의 16진수 인쇄 차이점 이해: -1의 경우

Go에서 정수 인쇄를 위한 %x 형식은 16진수 표기법의 값입니다. 이는 부호 있는 정수의 메모리 표현을 인쇄하는 C의 %x와는 다릅니다. 이 차이로 인해 음의 정수 -1을 인쇄할 때 예상치 못한 결과가 발생합니다.

In Go:

var x uint64 = 1 << 64 - 1
fmt.Printf("%x\n", x)

출력:

ffffffffffffffffffff

여기서 %x는 부호 없는 값 1<<64 - 1의 16진수 표현.

C에서:

#include <stdio.h>
int main() {
  uint64_t x = 1LL << 64 - 1;
  printf("%x\n", (long long)x);
}

출력:

-1

C에서 %x는 다음을 인쇄합니다. 부호 있는 정수 값 -1, 앞에 '-'가 붙은 음의 16진수 결과가 나오는 것 같습니다. 그러나 이는 사실이 아니다. '-' 기호는 정수가 음수임을 나타내고 16진수 값 ffff...ff는 -1의 2의 보수 표현입니다.

Go는 엄격한 유형 지정을 시행하므로 부호 있는 정수를 다음과 같이 처리하려면 명시적인 유형 변환이 필요합니다. 서명되지 않은. Go에서 -1을 부호 없는 값으로 인쇄하려면:

i := -1 // type int
fmt.Printf("%x", uint(i))

출력:

ffffffff

이 접근 방식은 부호 있는 정수 -1을 부호 없는 대응 값으로 변환하여 올바른 16진수 표현을 얻습니다. .

음수를 부호 있는 값으로 인쇄하는 Go의 기본 동작은 간결한 표현을 허용하지만 16진수 컨텍스트에서는 예상치 못한 결과가 발생할 수 있습니다. Go에서 효과적인 코드를 작성하려면 이러한 차이점을 이해하는 것이 중요합니다.

위 내용은 Go와 C에서 -1을 16진수로 인쇄하면 왜 다른 결과가 나오나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.