-
- Мой вариант вдвигает знак слева. Обратите внимание на тип: int32_t. Update: да, стандарт C99 говорит "implementation-defined". Но ведь на яре работает, чего же боле? :-) SciFi(344 знак., 13.02.2012 10:18 - 10:26)
- Кстати да. Очень качественные грабли языка C опять же. Сдвиги вправо они эта, могут быть арифметическими (сохранется 7-й бит), а могут быть с нулём в старшем разряде. Компиляторозависимо. Поймал себя на мысли -- я сейчас отловил пару багов в своих fk0(18 знак., 13.02.2012 00:53)
- А ведь Ты ещё за 2000 не ответил!!! - T.Дocтoeвcкий(13.02.2012 03:36, ссылка)
- Это ты гонишь, но.., если кто-то говорит тебе про переносимый код, гони его в шею. - java(13.02.2012 03:04,
)
- Нужно отучаться от ассемблерного мышления делить сдвигами -- легко облажаться. - fk0(13.02.2012 00:55)
- да. Нормальный компилятор сам вместо деления сдвиги подставит когда нужно. Насчёт сдвига вправо в разных местах информация немного различается koyodza(481 знак., 13.02.2012 10:07)
- В первом случае все верно - они описывают свой компилятор. По второй ссылке они противоречат стандарту, ибо стандарт ясно говорит: Сергей Борщ(732 знак., 13.02.2012 11:35)
- почему по второй противоречат? Всё в полном соответствии Вашей цитате - koyodza(13.02.2012 11:58)
- Потому что они пишут "В противном случае они заполняются копией знакового бита" не указывая конкретный компилятор, а в стандарте такого нет. - Сергей Борщ(13.02.2012 12:02 - 12:09)
- ну да, Вы правы, могут заполняться или не заполняться, implementation-defined - koyodza(13.02.2012 12:12)
- Потому что они пишут "В противном случае они заполняются копией знакового бита" не указывая конкретный компилятор, а в стандарте такого нет. - Сергей Борщ(13.02.2012 12:02 - 12:09)
- Очень понятно и очень печально. Получается, знаковые надежнее никогда не сдвигать вправо. - Andreas(13.02.2012 11:45)
- Вывод неправильный. Просто нужно защититься от неожиданности. Писал выше: assert_static((0x87654321L >> 8) == 0xFF876543L). - SciFi(13.02.2012 11:51)
- А что мешает препроцессору сдвигать константы одним способом, а компилятору переменные - другим? - Andreas(13.02.2012 11:59)
- Мешает стандарт. Препроцессор не выполняет арифметических действий - он делает лишь текстовые подстановки. Константные выражения считает компилятор. - Сергей Борщ(13.02.2012 12:07)
- К сведению, препроцессор ничего сдвигать не умеет. А компилятор должен одинаково сдвигать константы и не константы, иначе из него глюки попрут со всех сторон. - SciFi(13.02.2012 12:03)
- А что мешает препроцессору сдвигать константы одним способом, а компилятору переменные - другим? - Andreas(13.02.2012 11:59)
- Вывод неправильный. Просто нужно защититься от неожиданности. Писал выше: assert_static((0x87654321L >> 8) == 0xFF876543L). - SciFi(13.02.2012 11:51)
- почему по второй противоречат? Всё в полном соответствии Вашей цитате - koyodza(13.02.2012 11:58)
- В первом случае похоже имеется в виду, что у беззнакового числа знак всегда 0, т.е сдвиг вправо все-таки со знаком. Но всегда ли это так?? - Andreas(13.02.2012 10:14)
- Что-то у вас с логикой не так. Знак числа без знака? <уходит, качая головой> - SciFi(13.02.2012 10:47)
- с какой радости? У беззнакового числа старший бит может быть любым - koyodza(13.02.2012 10:43)
- В первом случае все верно - они описывают свой компилятор. По второй ссылке они противоречат стандарту, ибо стандарт ясно говорит: Сергей Борщ(732 знак., 13.02.2012 11:35)
- да. Нормальный компилятор сам вместо деления сдвиги подставит когда нужно. Насчёт сдвига вправо в разных местах информация немного различается koyodza(481 знак., 13.02.2012 10:07)