Bildiğimiz gibi, işaretli tamsayı taşması tanımsız bir davranıştır . Ancak C ++ 11 cstdintbelgelerinde ilginç bir şey var :
tam olarak 8, 16, 32 ve 64 bit genişliğinde, doldurma bitleri olmadan ve negatif değerler için 2'nin tümleyicisini kullanan işaretli tamsayı türü (yalnızca uygulama doğrudan türü destekliyorsa sağlanır)
Ve işte sorum şu: standart açıkça şunu söylüyor: int8_t , int16_t, int32_tve int64_tnegatif sayılar 2 tümleyen konusunda, hala taşma bu tür tanımlanmamış bir davranış mı?
Düzenle C ++ 11 ve C11 Standartlarını kontrol ettim ve işte bulduğum şey:
C ++ 11, §18.4.1:
Başlık, tüm fonksiyonları, türleri ve makroları C standardındaki 7.20 ile aynı şekilde tanımlar.
C11, §7.20.1.1:
Typedef adı
intN_t, N genişliğinde, dolgu biti içermeyen ve ikinin tamamlayıcı gösterimi olan işaretli bir tamsayı türünü belirtir. Bu nedenle,int8_ttam olarak 8 bit genişliğinde böyle bir işaretli tamsayı türünü belirtir.