Существует ли директива препроцессору GCC, чтобы проверить, компилируется ли код на машине на 64 бита?

В информатике отсчет всегда начинается с 0. Поэтому 0-й бит - самый правый. Вот почему в примере из этот ответ , 110 (6) << 1 становится 1100 (12). Это также означает, что сдвиг на 0 - это нулевая операция (она ничего не делает).

Это также означает, что для вашего случая, если вы хотите проверить самый правый бит, все, что вам нужно сделать, это byte & 1 - сдвиг не требуется.

14
задан Vilmorin 25 March 2009 в 18:44
поделиться

3 ответа

Я думаю __, LP64 __ мог бы быть тем, что Вы ищете. См. http://gcc.gnu.org/onlinedocs/gcc-4.1.2/cpp/Common-Predefined-Macros.html

Возможно, лучший способ пойти, тем не менее, состоит в том, чтобы использовать %p спецификатор для printf () вместо %ld или %d. Затем Вы не должны даже волновать, каков Ваш размер указателя.

24
ответ дан 1 December 2019 в 08:18
поделиться

Вы хотите использовать PRI* макросы, определенные в inttypes.h. Вы включаете им путем определения __STDC\_FORMAT\_MACROS. Можно затем использовать

 intptr_t d = ... ;
 printf("This is an intptr_t: %" PRIxPTR "\n", d);

PRIxPTR макрос расширится до llx если __WORDSIZE == 64, и lx или x иначе.

8
ответ дан 1 December 2019 в 08:18
поделиться

Рекомендуемое решение состоит в том, чтобы подать Вашу заявку, ведут себя больше очевидно. При создании этого зависящим от размера указателя памяти у Вас могут быть некоторые нежелательные неожиданности. Printf только понимает несколько типов, если необходимо распечатать значение для типа, что Вы не можете всегда удостоверяться, что он действительно известен, намного лучше преобразовать его во что-то известное.

printf("Some message with %ld in the middle of it\n", (long) d);

Это - хороший совет, и допустимый для любого типа. Например, для печати Unix PID (который имеет тип pid_t):

pid_t pid = fork();
printf("Fork returned %d.\n", (int) pid);

Вы не должны знать то, что является типом и размером pid, пока целевой тип является достаточно большим.

1
ответ дан 1 December 2019 в 08:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: