Здравствуйте! GCC сдвиг выполняет не арифметический, не логический, а какой-то волшебный: $ cat left64.c #include <stdint.h> #include <stdio.h> #define SHIFT(N, COUNT) ({ \ int a=COUNT; \ printf("a=%d\n", a); \ printf("%llu<<a = %llx\n", N, N << a); \ printf("%llu<<%d = %llx\n\n", N, COUNT, N << COUNT); \ }) int main() { SHIFT(3ULL, 63); SHIFT(3ULL, 64); SHIFT(3ULL, 65); SHIFT(1ULL, 63); SHIFT(1ULL, 64); SHIFT(1ULL, 65); return 0; } $ gcc left64.c $ ./a.out a=63 3<<a = 8000000000000000 3<<63 = 8000000000000000 a=64 3<<a = 3 3<<64 = 0 a=65 3<<a = 6 3<<65 = 0 a=63 1<<a = 8000000000000000 1<<63 = 8000000000000000 a=64 1<<a = 1 1<<64 = 0 a=65 1<<a = 2 1<<65 = 0 Как это понимать вообще? Как сделать чтоб 1<<{переменная} и 1<<{число} выдавали одинаковый результат?
Ответ на:
комментарий
от unDEFER
Ответ на:
комментарий
от tailgunner
Ответ на:
комментарий
от unDEFER
Ответ на:
комментарий
от tailgunner
Ответ на:
комментарий
от Casus
Ответ на:
комментарий
от Casus
Ответ на:
комментарий
от tailgunner
Ответ на:
комментарий
от Casus
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум Простейший вопрос - свои первые строчки на C. Где argv ? (2004)
- Форум почему так? (2014)
- Форум Интерпретируемые анекдоты на Ц :) (2005)
- Форум Вопрос по printf (2005)
- Форум Поломана совместимость с С в С++11? (2013)
- Форум fcloseall не работает (2015)
- Форум wchar_t (2013)
- Форум Как изменить максимальное число открытых файлов ? (2006)
- Форум [OMG] gcc и abs() (2008)
- Форум Что происходит в этом коде (2014)