Немного маскируясь в C, возвращая неожиданный результат - PullRequest
2 голосов
/ 14 января 2011

0x7F000000 равно 0111 1111 0000 0000 0000 0000 0000 0000 в 32-битном двоичном формате.
0x01000058 - это 0000 0001 0000 0000 0000 0000 0101 1000.

Когда я И два числа вместе, я ожидаю 0000 0001 0000 0000 0000 0000 0000 0000, но по некоторым причинам я получаю 0.

Вот мой код:

#define MASK_binop     0x80000000
#define MASK_operation 0x7F000000

int instruction=atoi(line);
if((MASK_binop & instruction)>0)
    printf("binop\n");
else if((MASK_operation & instruction)>0)
    printf("operation\n");

Каждое из приведенных выше сравнений возвращает ноль. Это как-то связано с 32/64 битами? Я использую 64-битный компилятор.

Ответы [ 3 ]

4 голосов
/ 14 января 2011

Если строка содержит «0x01000058», то atoi вернет 0, поскольку atoi работает с десятичным представлением, а не с шестнадцатеричным представлением 0x. И тогда AND, очевидно, равно нулю. Попробуйте напечатать значение инструкции.

3 голосов
/ 14 января 2011

Выполните

printf("%x", instruction);

и убедитесь, что инструкция действительно соответствует ожидаемой.

вы также можете сделать:

printf("%x", MASK_binop & instruction);
printf("%x", MASK_operation & instruction);

Чтобы увидеть, что именнопроисходит.

1 голос
/ 14 января 2011

Я только что попробовал, и это, кажется, работает как ожидалось.Сделайте printf( "%x\n", instruction);, чтобы показать, каково значение.

...