Здравствуйте!
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)