Bilangan bulat yang ditandatangani di C mewakili angka. Jika a
dan b
merupakan variabel dari tipe integer yang ditandatangani, standar tidak akan pernah mengharuskan kompiler membuat ekspresi a+=b
menyimpan menjadi a
apa pun selain jumlah aritmatika dari nilai masing-masing. Yang pasti, jika jumlah aritmatika tidak cocok a
, prosesor mungkin tidak dapat meletakkannya di sana, tetapi standar tidak akan meminta kompiler memotong atau membungkus nilai, atau melakukan hal lain untuk masalah ini jika nilai melebihi batas untuk tipenya. Perhatikan bahwa meskipun standar tidak memerlukannya, implementasi C diizinkan untuk menjebak aliran aritmatika dengan nilai yang ditandatangani.
Bilangan bulat tak bertanda di C berperilaku sebagai cincin aljabar abstrak bilangan bulat yang merupakan modul kongruen dengan kekuatan dua, kecuali dalam skenario yang melibatkan konversi ke, atau operasi dengan, tipe yang lebih besar. Mengubah bilangan bulat dari ukuran apa pun menjadi tipe 32-bit yang tidak ditandatangani akan menghasilkan anggota yang sesuai dengan hal-hal yang kongruen dengan bilangan bulat itu mod 4.294.967.296. Alasan mengurangi 3 dari 2 menghasilkan 4.294.967.295 adalah bahwa menambahkan sesuatu yang kongruen ke 3 ke sesuatu yang kongruen ke 4.294.967.295 akan menghasilkan sesuatu yang kongruen dengan 2.
Jenis cincin aljabar abstrak seringkali merupakan hal yang mudah untuk dimiliki; Sayangnya, C menggunakan signness sebagai faktor penentu apakah suatu tipe harus berperilaku sebagai cincin. Lebih buruk lagi, nilai-nilai yang tidak ditandatangani diperlakukan sebagai angka daripada anggota dering ketika dikonversi ke tipe yang lebih besar, dan nilai yang tidak ditandatangani lebih kecil daripada int
dikonversi ke angka ketika ada aritmatika dilakukan pada mereka. Jika v
adalah uint32_t
yang sama 4,294,967,294
, maka v*=v;
harus membuat v=4
. Sayangnya, jika int
64 bit, maka tidak ada yang tahu apa yang v*=v;
bisa dilakukan.
Mengingat standar seperti itu, saya akan menyarankan menggunakan tipe yang tidak ditandai dalam situasi di mana seseorang ingin perilaku yang terkait dengan cincin aljabar, dan tipe yang ditandatangani ketika seseorang ingin mewakili angka. Sangat disayangkan bahwa C menarik perbedaan seperti itu, tetapi mereka adalah apa adanya.