Para mi aplicación (OSX, no IOS) tengo una secuencia geométrica (almacenada en una matriz de contenedores) generada así:

- (void)initContainerFor:(NSInteger)maxRows
{

self.container = [[NSMutableArray alloc] init];
NSInteger start = [self.firstTextFieldValue integerValue];
NSInteger ratio = [self.secondTextFieldValue integerValue];

// ASCENDING
for (NSInteger i = 1; i < (maxRows +1 ); i++)
{
    NSInteger currentValue = start * pow(ratio,i-1);
    [self.container addObject:currentValue];
}
}

El usuario puede ingresar el número entero de "inicio" y "proporción". Quiero dar un comentario si se excede el límite (MAX_INT). Escribí esta función:

- (BOOL)maxCheck
{

    if ([self.container lastObject] > INT_MAX)
        return false;

    return true;
}

Pero esto parece no funcionar. Si ingreso 2 para el inicio y 200 para la proporción, tengo este contenido del contenedor:

Container: (
    2,
    400,
    80000,
    16000000,
    "-1094967296",
    49872896,
    1384644608,
    2051014656,
    "-2113929216",
    0
)

Por favor, ayude a comprender lo que veo en el contenedor (cadenas?) Y cómo obtener una verificación correcta del valor máximo.

0
Pat_Morita 14 dic. 2016 a las 10:43

2 respuestas

La mejor respuesta

No puede comparar el valor después del desbordamiento con INT_MAX, ya que el desbordamiento ya ocurrió. O dicho de otra manera, por su propia definición y semántica, ningún entero puede ser mayor que INT_MAX.

Lo que puedes probar es

[self.container lastObject] > INT_MAX/ratio

Para encontrar el elemento de secuencia que causaría un desbordamiento en el siguiente paso.

0
Lutz Lehmann 14 dic. 2016 a las 09:26

Como puede ver en el registro de la matriz, en realidad excede el límite INT_MAX dos veces, cuando el siguiente elemento se vuelve negativo. Por lo tanto, puede agregar check al método initContainer: si el elemento es menor que el anterior, se alcanza el límite INT_MAX.

SUGERENCIA: INT_MAX es un valor firmado .

1
Vladimir Vodolazkiy 14 dic. 2016 a las 07:57