Dalam kelas ketepatan besar C anda, anda menghadapi masalah di mana penambahan 0xffffffff dan 0x04 menghasilkan 0xffff0003 dan bukannya 0x01000000 yang dijangkakan. Isu ini timbul kerana penyebaran carry yang tidak betul.
Untuk memahami masalah, mari kita periksa situasi limpahan apabila menambah nombor yang besar. Apabila dua bait yang tidak ditandatangani (atau pendek yang tidak ditandatangani dalam kod anda) ditambahkan dan hasilnya melebihi nilai maksimum (255), bendera pembawa ditetapkan kepada 1. Pembawaan ini harus merambat ke bait seterusnya, menunjukkan bahawa hasilnya harus ditambah dengan 1.
Dalam kod anda, anda menetapkan bendera pembawa dengan betul apabila jumlah dua bait melimpah (255). Walau bagaimanapun, baris berikutnya tidak menyebarkan pembawa dengan betul. Berikut ialah kod yang bermasalah:
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; }
Isu 1:
Pernyataan kenaikan(&trhs, i 1) hanya meningkat trhs[i 1] apabila ret.data[ i].data == 255 dan ret.data[i 1].membawa == 1. Walau bagaimanapun, penyebaran pembawa harus berlaku tanpa mengira nilai ret.data[i].data.
Isu 2:
Ret.data[i]. data = ret.data[i 1].carry statement menambahkan carry ke ret.data[i].data, tetapi ini tidak betul. Bawaan hendaklah ditambahkan pada hasil sebelum menyimpannya dalam ret.data[i].data.
Penyelesaian:
Untuk membetulkan perambatan bawa, buat perkara berikut perubahan:
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 } }
Perubahan ini memastikan bawaan sentiasa disebarkan dengan betul. Apabila jumlah dua bait melebihi 255, ia menolak 256 daripada ret.data[i].data untuk melaraskan limpahan.
Atas ialah kandungan terperinci Mengapa Penambahan Ketepatan Besar C Saya Mempunyai Penyebaran Bawaan Yang Salah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!