iPhone Какао смешанный режим Math Основные ошибки - PullRequest
1 голос
/ 31 марта 2009

Только что понял, что получаю ошибки по простой математике, если я смешал Integer с числами в iPhone SDK на Simulator Два примера:

float testVal1 = 10 + 5/10; 
//evaluates to 10 instead of 10.5 unless I use explicit 10.0f..

// Problem Code mixed float int 
NSUInteger jvalue = 2312345;

NSInteger testVal2 = (jvalue - 2512345); // evaluates correctly
float testVal3 = (jvalue - 2512345); // fails with some huge bogus value

Я думал, что в смешанном режиме выражения он будет преобразовывать в значения с плавающей точкой. Кажется, это все или ничего при использовании поплавков, без смешивания

Что здесь не так?

Ответы [ 3 ]

4 голосов
/ 31 марта 2009

Ничего не происходит неправильно; это способ работы операций. Взгляните на ваш пример:

float testVal1 = 10 + 5/10; //evaluates to 10

Вот последовательность операций здесь:

  1. анализ 5: целочисленный литерал
    • проанализировать 10: целое число буквальное
    • 5/10: целочисленное деление, результат 0
    • 10 + [0]: сложение целых чисел, результат 10
    • присваивать результат с плавающей точкой

Чтобы сделать эту работу так, как вы хотите, по крайней мере, один из операндов деления должен быть с плавающей точкой. Результат теперь будет выглядеть примерно так:

  1. анализ 5: целочисленный литерал
    • анализ 10.0f: с плавающей точкой литерал
    • 5 / 10.0f: с плавающей запятой деление, результат 0,5
    • 10 + [0,5]: с плавающей запятой сложение, результат 10,5
    • присваивать результат с плавающей точкой
2 голосов
/ 31 марта 2009

Это не имеет ничего общего с iPhone или симулятором, оно связано с тем, как Objective-C и C выполняют арифметику. Компилятор интерпретирует операнды в 5/10 как целые числа, и целочисленное деление не может привести к дробному результату по определению. Таким образом, 10 + 5/10 == 10 + 0 == 10. Вы можете попробовать:

float testVal1 = 10.0f + 5.0f/10.0f;
1 голос
/ 31 марта 2009

Тип данных по умолчанию в подвыражении, таком как 5 / 10, является целым числом, пока один из операндов не скажет иначе. Однако (5 / 10) = 0 из-за целочисленного деления.

В выражении NSInteger testVal2 = (jvalue - 2512345); типом подвыражения по умолчанию является целое число без знака; ваш отрицательный результат вызывает недогрузку и фиктивное значение.

...