Jak wiemy, przepełnienie liczb całkowitych ze znakiem jest niezdefiniowanym zachowaniem . Ale w cstdint
dokumentacji C ++ 11 jest coś interesującego :
typ liczby całkowitej ze znakiem o szerokości odpowiednio 8, 16, 32 i 64 bitów bez wypełniania bitów i przy użyciu dopełnienia 2 dla wartości ujemnych (podany tylko wtedy, gdy implementacja bezpośrednio obsługuje typ)
I tu jest moje pytanie: skoro średnia mówi wyraźnie, że w przypadku int8_t
, int16_t
, int32_t
a int64_t
liczby ujemne są 2 uzupełniają, to nadal przepełnienia tych typów niezdefiniowany zachowanie?
Edycja Sprawdziłem standardy C ++ 11 i C11 i oto co znalazłem:
C ++ 11, §18.4.1:
Nagłówek definiuje wszystkie funkcje, typy i makra, tak samo jak 7.20 w standardzie C.
C11, §7.20.1.1:
Nazwa typedef
intN_t
oznacza typ liczby całkowitej ze znakiem o szerokości N, bez bitów wypełniających i reprezentacją dopełnienia do dwójki. Zatemint8_t
oznacza taki typ liczby całkowitej ze znakiem o szerokości dokładnie 8 bitów.