C 대형 정밀 클래스에서 0xffffffff와 0x04를 추가하면 예상되는 0x0100000003 대신 0xffff0003이 되는 문제가 발생합니다. 이 문제는 잘못된 캐리 전파로 인해 발생합니다.
문제를 이해하기 위해 큰 수를 추가할 때 오버플로 상황을 살펴보겠습니다. 두 개의 부호 없는 바이트(또는 코드의 부호 없는 Short)가 추가되고 결과가 최대값(255)을 초과하면 캐리 플래그가 1로 설정됩니다. 이 캐리는 다음 바이트로 전파되어야 하며 결과가 다음 바이트만큼 증가해야 함을 나타냅니다. 1.
귀하의 코드에서는 두 바이트의 합이 오버플로될 때(255) 캐리 플래그를 올바르게 설정했습니다. 그러나 후속 라인은 올바른 캐리를 전파하지 않습니다. 문제가 있는 코드는 다음과 같습니다.
if (i < lhs.nbytes) { if (ret.data[i].data == 255 && ret.data[i + 1].carry == 1) increment(&trhs, i + 1); ret.data[i].data += ret.data[i + 1].carry; }
문제 1:
increment(&trhs, i 1) 문은 ret.data[ i].data == 255 및 ret.data[i 1].carry == 1. 그러나 캐리 전파는 ret.data[i].data 값에 관계없이 발생해야 합니다.
문제 2:
ret.data[i].data = ret.data[i 1].carry 문은 캐리를 추가합니다. ret.data[i].data이지만 이는 올바르지 않습니다. 캐리는 ret.data[i].data에 저장하기 전에 결과에 추가되어야 합니다.
해결책:
캐리 전파를 수정하려면 다음을 수행하세요. 변경 사항:
if (i < lhs.nbytes) { ret.data[i].data += ret.data[i + 1].carry; if (ret.data[i].data > 255) { increment(&trhs, i + 1); ret.data[i].data -= 256; // Subtract 256 to adjust for overflow } }
이러한 변경 사항은 캐리가 항상 올바르게 전파되도록 보장합니다. 2바이트의 합이 255를 초과하면 ret.data[i].data에서 256을 빼서 오버플로를 조정합니다.
위 내용은 내 C 대형 정밀도 추가에 캐리 전파가 잘못된 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!