Saya telah menemukan kode dari seseorang yang tampaknya percaya ada masalah mengurangi bilangan bulat unsigned dari bilangan bulat lain dari jenis yang sama ketika hasilnya akan negatif. Jadi kode seperti ini tidak akan benar meskipun kebetulan berfungsi pada sebagian besar arsitektur.
unsigned int To, Tf;
To = getcounter();
while (1) {
Tf = getcounter();
if ((Tf-To) >= TIME_LIMIT) {
break;
}
}
Ini adalah satu-satunya kutipan relevan yang samar-samar dari standar C yang dapat saya temukan.
Perhitungan yang melibatkan operand unsigned tidak akan pernah bisa overflow, karena hasil yang tidak dapat diwakili oleh jenis unsigned integer yang dihasilkan dikurangi modulo bilangan yang satu lebih besar dari nilai terbesar yang dapat diwakili oleh jenis yang dihasilkan.
Saya kira orang bisa mengambil kutipan itu berarti bahwa ketika operan kanan lebih besar operasi disesuaikan agar bermakna dalam konteks nomor terpotong modulo.
yaitu
0x0000 - 0x0001 == 0x 1 0000 - 0x0001 == 0xFFFF
sebagai kebalikan dari penggunaan semantik bertanda tangan yang bergantung pada implementasi:
0x0000 - 0x0001 == (unsigned) (0 + -1) == (0xFFFF tetapi juga 0xFFFE atau 0x8001)
Manakah atau interpretasi apa yang benar? Apakah itu didefinisikan sama sekali?