Чистый СИ. Указатели.

cDLEON

Онанист РНРСlub
Pigmeich
а в str_reverse и так цикл крутиццо до len\2.
Но я видь не знаю как округлять в СИ :D посему решил это дело не мене изящно :D
tony2001
Тонь, я видел эту тему, только я не уверен что потяну =(
 

cDLEON

Онанист РНРСlub
Желание, возможно, есть, а вот знание английского приметивное :D
 

tony2001

TeaM PHPClub
ну, это надо решать тогда.
для этого тоже мало что надо, кроме желания =)
 

Ирокез

бессмертный пони
Команда форума
Партнер клуба
Автор оригинала: cDLEON
Но я видь не знаю как округлять в СИ :D посему решил это дело не мене изящно :D
int m = 5 >> 1; // Битовый сдвиг 00000101 >> 1 = 00000010
int m = 5/2; // Тут сработает приведение типов и автоматически округлится до целого числа
 

cDLEON

Онанист РНРСlub
Вот. Кстати. Что нужно хорошо знать, что бы знать что произойдёт с числом после битового сдвига. Ну и вообще дружить с этой операцией ? Переведение из двоичной в десятичную ? :D
 

fixxxer

К.О.
Партнер клуба
хосспади. :)
ну возьми любой "программерский" калькулятор и поиграйся
 

cDLEON

Онанист РНРСlub
fixxxer
Ну прост видел я в одном месте енкодинг ф-ю. В которой кишма этих битовых операций. Но так я и не понял что эти битове операции делуют. И как их высчитывать на том уровне, который я видел. И там, я думаю, тот чел, который это писал, калькулятором не пользовалси :D
Ирокез
Тут сработает приведение типов и автоматически округлится до целого числа
Чем больше узнаю СИ, тем больше мне этот язык нравится :D
Сразу вспоминается делфа с её функциями типа floattoint :D
 

Pigmeich

Новичок
cDLEON
а в str_reverse и так цикл крутиццо до len\2.
Но я видь не знаю как округлять в СИ посему решил это дело не мене изящно
Но проделывает кучу накладных расходов.

деление над целыми производиться целочисленной операцией деления, округление вниз.

Ирокез
int m = 5/2; // Тут сработает приведение типов и автоматически округлится до целого числа
для общего кругозора напиши
double d = 10/3;
и выведи. :))))

Никакого преобразования типов там нет.

Вот. Кстати. Что нужно хорошо знать, что бы знать что произойдёт с числом после битового сдвига. Ну и вообще дружить с этой операцией ? Переведение из двоичной в десятичную ?
Надо просто двоичную систему знать. В десятичной ведь у тебя числа не хранятся? (хотя есть такая ассемблерная фишка: двоично-деситичный формат).
Сдвиг нужно применять когда это оправданно задачей: при работе с флагами или собственными форматами. /2 до сдвига оптимизировали еще компиляторы поздних 80-х.

Чем больше узнаю СИ, тем больше мне этот язык нравится
Сразу вспоминается делфа с её функциями типа floattoint
atoi и так далее... :)

Кстати, тут где-то был мега-флуд на тему убыстрения floattoint раз в 10. Если найду - ссылку дам.
 

Ирокез

бессмертный пони
Команда форума
Партнер клуба
Автор оригинала: Pigmeich

Ирокез

для общего кругозора напиши
double d = 10/3;
и выведи. :))))

Никакого преобразования типов там нет.
Внимательно ознакомьтесь с привидениями типов, а также с порядком выполнения операций, но если уж на то пошло, то в данном вашем случае выполняется операция над целыми числами, а уж потом оно записывается в переменную 'd', в основах C/C++ все подробно расписано. Удачи.
 

Pigmeich

Новичок
Внимательно ознакомьтесь с привидениями типов, а также с порядком выполнения операций, но если уж на то пошло, то в данном вашем случае выполняется операция над целыми числами, а уж потом оно записывается в переменную 'd', в основах C/C++ все подробно расписано. Удачи.
Ирокез
int m = 5/2; // Тут сработает приведение типов и автоматически округлится до целого числа
Тут не сработает приведение типов, и операция приведения к целому числу выполнена не будет.
Если не согласны - прошу цитату из Кернигана и Ричи.

-~{}~ 14.01.08 13:50:

int m = 5 >> 1; // Битовый сдвиг 00000101 >> 1 = 00000010
int m = 5/2; // Тут сработает приведение типов и автоматически округлится до целого числа
Либо, с помощью дизасебмблера, найдите компилятор старше 90-го года, делающий эти две операции по разному.
 

Ирокез

бессмертный пони
Команда форума
Партнер клуба
При чем тут компиляция к стандарту. Современные компиляторы, давно вышли за пределы подстановки, каждый компилятор, пытается сделать работу за программиста (что в принципе верно), если бы каждый программист вручную раскидывал машинные коды по конвейерам, процессора...... , но и самому думать, то же иногда надо.
 

phprus

Moderator
Команда форума
Ирокез
Внимательно ознакомьтесь с привидениями типов, а также с порядком выполнения операций, но если уж на то пошло, то в данном вашем случае выполняется операция над целыми числами, а уж потом оно записывается в переменную 'd', в основах C/C++ все подробно расписано. Удачи.
Не надо нести бред. В С и С++ оператор "/" работает как оператор целочисленного деления если оба его операнда целые числа (результат в этом случае ТОЖЕ целое число). Если же тип хотя-бы одного операнда с плавающей точкой, то этот оператор становится обычным оператором деления и его результат будет числом с плавающей точкой.

Пример:
int a = 1/2; // Приведения типов НЕТ. Сработал оператор целочисленного деления.
int b = 1.0/2; // Приведения типов ЕСТЬ. Сработал оператор обычного деления.

double c = 1/2; // Приведения типов ЕСТЬ. Сработал оператор целочисленного деления. (в "с" будет 0.0)
double d = 1.0/2; // Приведения типов НЕТ. Сработал оператор обычного деления.
 

Ирокез

бессмертный пони
Команда форума
Партнер клуба
Автор оригинала: phprus
Ирокез

Не надо нести бред. В С и С++ оператор "/" работает как оператор целочисленного деления если оба его операнда целые числа (результат в этом случае ТОЖЕ целое число). Если же тип хотя-бы одного операнда с плавающей точкой, то этот оператор становится обычным оператором деления и его результат будет числом с плавающей точкой.

Пример:
int a = 1/2; // Приведения типов НЕТ. Сработал оператор целочисленного деления.
int b = 1.0/2; // Приведения типов ЕСТЬ. Сработал оператор обычного деления.

double c = 1/2; // Приведения типов ЕСТЬ. Сработал оператор целочисленного деления. (в "с" будет 0.0)
double d = 1.0/2; // Приведения типов НЕТ. Сработал оператор обычного деления.
улыбнуло :) , а кто спорит с вашим утверждением, и мягче надо, мягче.

а что будет в случае int a = 5./2; неужели приведение типов не сработает :eek: , в ответе имелось ввиду, что в С\С++ имется возможность приведения типов, а не то как приводятся типы в зависимости от операндов и разводить полемику на тему а как, то а как се, нет желания. Удачи
 

phprus

Moderator
Команда форума
Ирокез
а кто спорит с вашим утверждением
Вы. Не верите? Тогда смотрите:
int m = 5/2; // Тут сработает приведение типов и автоматически округлится до целого числа
Тут НЕ будет приведения типов. Тут сам оператор "/" вернет целое число без всяких преобразований типов.

а что будет в случае int a = 5./2; неужели приведение типов не сработает
Тут приведение типов сработает. В моем примере этот случай рассмотрен.
 

Pigmeich

Новичок
Ирокез
Сейчас, просто объясни, что ты имел в виду, когда писал, эут строчку:
int m = 5/2; // Тут сработает приведение типов и автоматически округлится до целого числа
Мне кажется, это неправильно.
 

phprus

Moderator
Команда форума
Pigmeich
Мне кажется, это неправильно.
Тебе не кажется. Комментарий тут действительно неправильный. Тут не будет приведения типов и будет использован оператор целочисленного деления.
 

phprus

Moderator
Команда форума
Pigmeich
я дипломатично пытался объяснить.
ИМХО это тут не поможет, так как не только мы указали Ирокезу на его грубейшие ошибки, но он все-равно пытался оправдаться и говорил что написал все правильно. А человеку, который не умеет признавать свои ошибки невозможно чего-либо объяснить.
 

Ирокез

бессмертный пони
Команда форума
Партнер клуба
Господа, Вы мне напоминаете старух возле моего дома. Ввести беседу, построенную на неуважении и хамстве у меня нет никакого желания. Если Вам хочется потрепаться языком, а не разрабатывать серьёзные вещи (отличные от калькулятора), мешать вам и что-то там признавать лично я не вправе, это право модераторов и администраторов. Я же очень сожалею, о том что тут процветает хамство.

Что касаемо темы:

Речь не шла о том как происходит приведение типов, я в сообщении пытался указать, что в с\с++ есть возможность автоматического приведения типов (возможно пример был неудачен).

Если вы подняли эту тему, то то что вы писали является такой-же окалесицей, на этапе сборки компилятор в целях оптимизации заменяет int d = 5/2; на результат выполнения и ни о каком приведении типов речь не может идти

int d = 10./3; //mov dword ptr [d],3

int s = 5/2; //mov dword ptr ,2

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