W C99 istnieją pewne (opcjonalne) typy, takie jak int8_t
, int16_t
i tym podobne, z gwarancją, że mają dokładnie określoną szerokość i brak bitów dopełniających i reprezentują liczby w dopełnieniu dwójki (7.18.1.1). W 6.2.6.2 sygnowane przekroczenie liczby całkowitej jest wymienione w przypisach 44) i 45), a mianowicie może skutkować wartościami pułapkowania w bitach dopełniających.Czy przepełnienie intN_t jest dobrze zdefiniowane?
Jako że intN_t
nie ma żadnych bitów dopełniających, a na pewno są one uzupełnieniem dwójki, czy oznacza to, że ich przepełnienie nie generuje niezdefiniowanych zachowań? Jaki byłby rezultat np. przepełnione mnożenie? A co z dodatkiem? Czy wynik jest mniejszy modulo 2^N
jak dla typów bez znaku?
Nie, nadal UB ... –
IANALL, ale mimo że są one reprezentowane za pomocą uzupełnienia 2, nadal nie przestrzegają praw arytmetycznego modulo 2^n, więc wynik przepełnienia nie jest zdefiniowany matematycznie. Standard mówi: "Jeśli podczas oceny wyrażenia wynik nie jest zdefiniowany matematycznie lub nie mieści się w zakresie reprezentowalnych wartości dla jego typu, zachowanie jest niezdefiniowane.". – tux3
Nawet dla 'uintN_t', przepełnienie nie jest (ogólnie) dobrze zdefiniowane. Zarówno 'intN_t' jak i' uintN_t' nadal podlegają promocjom całkowitym i możliwe jest pomnożenie dwóch wartości 'uint16_t', w systemach, w których' uint16_t' promuje do 'int', aby wytworzyć wynik, który nie może być reprezentowany w' int '. – hvd