Inteiro de variáveis não possuem envoltório comportamento em linguagem C.Assinado de estouro de número inteiro durante cálculos aritméticos produz comportamento indefinido.Nota BTW que o compilador GCC que você mencionou é conhecido pela aplicação de estrito sobrecarga semântica em otimizações, o que significa que ele aproveita a liberdade proporcionada por tal comportamento indefinido situações:GCC compilador assume que o número inteiro assinado de valores nunca enrole ao redor.O que significa que o GCC, na verdade, passa a ser um dos compiladores em que você não dependem de wrap-around comportamento do inteiro assinado de tipos.
Por exemplo, o compilador GCC pode-se assumir que para a variável int i
a seguinte condição
if (i > 0 && i + 1 > 0)
é equivalente a um mero
if (i > 0)
Isso é exatamente o que estrito sobrecarga semântica significa.
Inteiro não assinado tipos de implementar módulo aritmético.O módulo é igual 2^N
onde N
é o número de bits na representação de valor do tipo.Por esta razão inteiro não assinado de tipos, de fato, aparecer para moldar em excesso.
No entanto, a linguagem C nunca realiza cálculos aritméticos em domínios menores do que a da int
/unsigned int
.Tipo unsigned short int
que você menciona na sua pergunta, normalmente será promovido para o tipo de int
em expressões antes de qualquer cálculos começar (supondo que o intervalo de unsigned short
encaixa-se no intervalo de int
).O que significa que 1) os cálculos com unsigned short int
será efectuada no domínio da int
, com o estouro acontecer quando int
estouros, 2) excesso durante tais cálculos levarão a um comportamento indefinido, não wrap-around comportamento.
Por exemplo, este código produz um envoltório em torno de
unsigned i = USHRT_MAX;
i *= INT_MAX; /* <- unsigned arithmetic, overflows, wraps around */
enquanto esse código
unsigned short i = USHRT_MAX;
i *= INT_MAX; /* <- signed arithmetic, overflows, produces undefined behavior */
leva a um comportamento indefinido.
Se não int
estouro acontece e o resultado é convertido para um unsigned short int
tipo, ele é novamente reduzida por módulo 2^N
, que irá aparecer como se o valor foi enrolado.