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 중국어 웹사이트의 기타 관련 기사를 참조하세요!