В информатике отсчет всегда начинается с 0. Поэтому 0-й бит - самый правый. Вот почему в примере из этот ответ , 110 (6) << 1
становится 1100 (12)
. Это также означает, что сдвиг на 0 - это нулевая операция (она ничего не делает).
Это также означает, что для вашего случая, если вы хотите проверить самый правый бит, все, что вам нужно сделать, это byte & 1
- сдвиг не требуется.
Я думаю __, LP64 __ мог бы быть тем, что Вы ищете. См. http://gcc.gnu.org/onlinedocs/gcc-4.1.2/cpp/Common-Predefined-Macros.html
Возможно, лучший способ пойти, тем не менее, состоит в том, чтобы использовать %p спецификатор для printf () вместо %ld или %d. Затем Вы не должны даже волновать, каков Ваш размер указателя.
Вы хотите использовать PRI*
макросы, определенные в inttypes.h
. Вы включаете им путем определения __STDC\_FORMAT\_MACROS
. Можно затем использовать
intptr_t d = ... ;
printf("This is an intptr_t: %" PRIxPTR "\n", d);
PRIxPTR
макрос расширится до llx
если __WORDSIZE == 64
, и lx
или x
иначе.
Рекомендуемое решение состоит в том, чтобы подать Вашу заявку, ведут себя больше очевидно. При создании этого зависящим от размера указателя памяти у Вас могут быть некоторые нежелательные неожиданности. 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, пока целевой тип является достаточно большим.