Bildiğimiz gibi, işaretli tamsayı taşması tanımsız bir davranıştır . Ancak C ++ 11 cstdint
belgelerinde 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_t
ve int64_t
negatif 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_t
tam olarak 8 bit genişliğinde böyle bir işaretli tamsayı türünü belirtir.