Eu me lembro que estava lendo isso
underflow
significa que você tem uma magnitude muito pequena que não pode mais ser apresentada em um tipooverflow
significa que você tem uma magnitude muito grande que não pode mais ser apresentada em um tipo
No entanto, na prática, percebo que os termos são usados de tal maneira que
underflow
significa que você tem um valor muito pequeno que não pode mais ser apresentado em um tipooverflow
significa que você tem um valor muito grande que não pode mais ser apresentado em um tipo
Qual é o significado correto para usar aqui? Os termos são definidos de maneira diferente para os tipos inteiro e ponto flutuante?
terminology
Johannes Schaub - litb
fonte
fonte
INT_MIN - 1
ou nãoINT_MAX + 1
Respostas:
Não consigo realmente encontrar uma fonte "autorizada" sobre esse assunto, principalmente porque isso é provavelmente uma questão de convenção, e a terminologia geralmente é muito inconsistente. Mas, o trecho a seguir de " Secure Coding in C and C ++ " de Robert Seacord resume minha compreensão da situação:
A nota de rodapé continua dizendo:
O motivo pelo qual chamamos de excesso de número inteiro é porque simplesmente não há espaço suficiente disponível no tipo para representar o valor. Nesse sentido, é semelhante a um estouro de buffer (exceto que, em vez de realmente cruzar o limite do buffer, geralmente exibe um comportamento envolvente. *) Nessa perspectiva, não há diferença conceitual entre
INT_MIN - 1
eINT_MAX + 1
. Nos dois casos, simplesmente não há espaço suficiente noint
tipo de dados para representar os dois valores - portanto, o que temos é um estouro .Também pode ser útil observar que nas arquiteturas dos processadores x86 e x86_64, o registro de sinalizadores inclui um bit de estouro . O bit de estouro é definido quando uma operação aritmética de número inteiro assinado transborda. A expressão
INT_MIN - 1
definirá o bit de estouro. (Não há um bit "underflow"). Tão claramente, os engenheiros da AMD e da Intel usam o termo "overflow" para descrever o resultado de uma operação aritmética inteira que possui muitos bits para caber no tipo de dados, independentemente de o o valor é numericamente muito grande ou muito pequeno.* De fato, em C, o excesso de número inteiro assinado é na verdade um comportamento indefinido, mas em outras linguagens como Java, a aritmética de complemento dos dois será contornada.
fonte
É um estouro. Um fluxo insuficiente não ocorre para valores inteiros.
Um estouro é quando um valor é muito grande (muito longe de zero) para ser representado pelo tipo específico, e um fluxo insuficiente é quando é muito pequeno (muito próximo de zero).
Como os valores inteiros mais próximos de zero (1 e -1) ainda podem ser representados por qualquer variável inteira (assumindo um número inteiro assinado com mais de um bit), um subfluxo não pode ocorrer.
O artigo da Wikipedia sobre subfluxo tem uma descrição bastante clara:
fonte
underflow
geralmente é usado especificamente para se referir à condição específica em que a magnitude de um número é menor que a do menor valor possível, diferente de zero, mas maior que a menor distância possível entre valores diferentes de zero - em outras palavras, casos em que os números se enquadram no que o artigo da Wiki chama de "lacuna de fluxo insuficiente". Em implementações compatíveis com IEEE-744, o menor número representável é igual à menor diferença representável entre números, portanto, essas subfluxos não podem ocorrer, mas fora do mundo dos PCs, nem todos os sistemas são compatíveis com IEEE.Em matemática inteira, o excesso refere-se a valores muito grandes e muito pequenos. No ponto flutuante, o estouro se refere a um expoente muito grande e o estouro se refere a um expoente muito pequeno.
De fato, para tipos inteiros , as CPUs não têm como diferenciar entre estouro e estouro. Faça o seguinte acréscimo de 16 bits:
O sinalizador de estouro na CPU seria, é claro, definido após esse acréscimo. Usando matemática assinada, o resultado é muito pequeno (-32768). Usando matemática não assinada, o resultado é muito grande (0x17FFF). Como a matemática do complemento de 2 é idêntica para os tipos assinado e não assinado,
overflow
é forçada a significar valores muito grandes e muito pequenos.fonte