int m = 5 >> 1; // Битовый сдвиг 00000101 >> 1 = 00000010Автор оригинала: cDLEON
Но я видь не знаю как округлять в СИпосему решил это дело не мене изящно
![]()
Чем больше узнаю СИ, тем больше мне этот язык нравитсяТут сработает приведение типов и автоматически округлится до целого числа
Но проделывает кучу накладных расходов.а в str_reverse и так цикл крутиццо до len\2.
Но я видь не знаю как округлять в СИ посему решил это дело не мене изящно
для общего кругозора напишиint m = 5/2; // Тут сработает приведение типов и автоматически округлится до целого числа
Надо просто двоичную систему знать. В десятичной ведь у тебя числа не хранятся? (хотя есть такая ассемблерная фишка: двоично-деситичный формат).Вот. Кстати. Что нужно хорошо знать, что бы знать что произойдёт с числом после битового сдвига. Ну и вообще дружить с этой операцией ? Переведение из двоичной в десятичную ?
atoi и так далее...Чем больше узнаю СИ, тем больше мне этот язык нравится
Сразу вспоминается делфа с её функциями типа floattoint
Внимательно ознакомьтесь с привидениями типов, а также с порядком выполнения операций, но если уж на то пошло, то в данном вашем случае выполняется операция над целыми числами, а уж потом оно записывается в переменную 'd', в основах C/C++ все подробно расписано. Удачи.Автор оригинала: Pigmeich
Ирокез
для общего кругозора напиши
double d = 10/3;
и выведи.)))
Никакого преобразования типов там нет.
ИрокезВнимательно ознакомьтесь с привидениями типов, а также с порядком выполнения операций, но если уж на то пошло, то в данном вашем случае выполняется операция над целыми числами, а уж потом оно записывается в переменную 'd', в основах C/C++ все подробно расписано. Удачи.
Тут не сработает приведение типов, и операция приведения к целому числу выполнена не будет.int m = 5/2; // Тут сработает приведение типов и автоматически округлится до целого числа
Либо, с помощью дизасебмблера, найдите компилятор старше 90-го года, делающий эти две операции по разному.int m = 5 >> 1; // Битовый сдвиг 00000101 >> 1 = 00000010
int m = 5/2; // Тут сработает приведение типов и автоматически округлится до целого числа
Не надо нести бред. В С и С++ оператор "/" работает как оператор целочисленного деления если оба его операнда целые числа (результат в этом случае ТОЖЕ целое число). Если же тип хотя-бы одного операнда с плавающей точкой, то этот оператор становится обычным оператором деления и его результат будет числом с плавающей точкой.Внимательно ознакомьтесь с привидениями типов, а также с порядком выполнения операций, но если уж на то пошло, то в данном вашем случае выполняется операция над целыми числами, а уж потом оно записывается в переменную 'd', в основах C/C++ все подробно расписано. Удачи.
улыбнулоАвтор оригинала: phprus
Ирокез
Не надо нести бред. В С и С++ оператор "/" работает как оператор целочисленного деления если оба его операнда целые числа (результат в этом случае ТОЖЕ целое число). Если же тип хотя-бы одного операнда с плавающей точкой, то этот оператор становится обычным оператором деления и его результат будет числом с плавающей точкой.
Пример:
int a = 1/2; // Приведения типов НЕТ. Сработал оператор целочисленного деления.
int b = 1.0/2; // Приведения типов ЕСТЬ. Сработал оператор обычного деления.
double c = 1/2; // Приведения типов ЕСТЬ. Сработал оператор целочисленного деления. (в "с" будет 0.0)
double d = 1.0/2; // Приведения типов НЕТ. Сработал оператор обычного деления.
Вы. Не верите? Тогда смотрите:а кто спорит с вашим утверждением
Тут НЕ будет приведения типов. Тут сам оператор "/" вернет целое число без всяких преобразований типов.int m = 5/2; // Тут сработает приведение типов и автоматически округлится до целого числа
Тут приведение типов сработает. В моем примере этот случай рассмотрен.а что будет в случае int a = 5./2; неужели приведение типов не сработает
Мне кажется, это неправильно.int m = 5/2; // Тут сработает приведение типов и автоматически округлится до целого числа
Тебе не кажется. Комментарий тут действительно неправильный. Тут не будет приведения типов и будет использован оператор целочисленного деления.Мне кажется, это неправильно.
ИМХО это тут не поможет, так как не только мы указали Ирокезу на его грубейшие ошибки, но он все-равно пытался оправдаться и говорил что написал все правильно. А человеку, который не умеет признавать свои ошибки невозможно чего-либо объяснить.я дипломатично пытался объяснить.