다음 프로그램을 실행하면 :
#include <iostream>
int main()
{
using namespace std;
uint64_t f12 = 18446744073709551568;
uint64_t f3 = 2;
uint64_t f123 = f12 * f3;
cout << f12 << endl;
cout << f3 << endl;
cout << f123 << endl;
return 0;
}
출력으로 얻습니다.
18446744073709551568
2
18446744073709551520
왜 f12의 2 배가 더 적은 값 (정확히 48)이되는지를 이해하지 못합니다. uint64 값의 크기에 도달하여 값이 롤오버 된 경우 매우 다르지 않습니까 (극단적 인 우연이 아니라면)?
당신은 그것을 "극단적 인 우연"으로 분류 할 수 있습니다. 18446744073709551568 바이너리는
FFFFFFFFFFFFFFD0
우리 모두는 이진 수학을 배웠을 때 2 곱하기가 왼쪽 이동과 동일하다는 것을 발견했습니다.
FFFFFFFFFFFFFFA0
그 주 D0
입니다
11010000
2 진수로, 높은 비트가 설정되어 있으므로 하위 8 비트를 왼쪽으로 이동하면
10100000
또는 A0
(높은 비트가 왼쪽으로 이동 됨).
그리고 이제 FFFFFFFFFFFFFFA0
십진수를 계산 하면 질문에 대한 답을 얻을 수 있습니다 (순전히 우연히 48 A0
개가 D0
되는 30
16 진수 보다 작기 때문에 이미 실마리를 얻고 있습니다).
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다