C işaretli tamsayılar sayıları temsil eder. Eğer a
ve b
türleri tamsayı imzalanmış bir değişkenlerdir, standart bir derleyici ifadesi yapmanız gerektiğinden asla a+=b
içine mağazayı a
kendi değerlerinin aritmetik toplamından daha başka bir şey. Aritmetik toplamı uymaz olsaydı, emin olmak için a
işlemci, belki oraya koymak mümkün olmayabilir, ancak standart truncate için derleyici gerektirmediğine veya değeri kaydırmak veya aşan değerler ise bu konuda başka bir şey yapmak türleri için sınırlar. Standart gerektirmezken, C uygulamalarının aritmetik taşmaları işaretli değerlerle yakalamasına izin verildiğini unutmayın.
C'deki işaretsiz tamsayılar, daha büyük tiplere dönüştürme veya bunlarla yapılan işlemleri içeren senaryolar haricinde, ikisinin bir miktar gücü olan uyumlu tam sayıların soyut cebir halkaları gibi davranırlar. Herhangi bir boyuttaki bir tamsayıyı 32-bit işaretsiz tipe dönüştürmek, 4.294.967.296 tamsayı moduna uygun olan şeylere karşılık gelen elemanı verecektir. 3'ün 2'den çıkarılmasının nedeni 4,294,967,295'in, 4,294,967,295'e uygun bir şeye 3'e uygun bir şey eklemenin 2'ye uygun bir şey vermesidir.
Soyut cebirsel halka tipleri genellikle elverişli şeylerdir; maalesef C, bir türün halka olarak davranıp davranmayacağı konusunda belirleyici faktör olarak imzayı kullanır. Daha kötüsü, işaretsiz değerler, daha büyük türlere dönüştürüldüğünde halka üyeleri yerine sayı olarak kabul edilir ve int
üzerlerine herhangi bir aritmetik gerçekleştirildiğinde sayılara dönüştürülmekten daha küçük işaretsiz değerler olarak kabul edilir . Eğer v
bir uint32_t
eşit ise 4,294,967,294
, o zaman v*=v;
yapmalıdır v=4
. Ne yazık ki, int
64 bit ise, o zaman ne v*=v;
yapabileceğini söylemek mümkün değil.
Standart olduğu gibi, bir kişinin cebirsel halkalarla ilişkili davranışı istediği durumlarda işaretsiz türler ve sayıları temsil etmek istediği zaman imzalı türler kullanmanızı öneririm. C'nin ayrımları olduğu gibi çizmesi talihsiz bir durum, ama onlar oldukları şey.