Как установить 45-й бит в поле 64-битного регистра?

Я пытался установить 46-й бит в регистре, какой из 64-битных в ширину, используя C. Как мне установить этот бит?

В настоящее время я делаю это:

uint32_t= address ;
uint64_t data =1ULL << 46;

Печать показывает, что бит 14 устанавливается. Я не могу установить четный бит 32. Если я установил бит 32, он устанавливает бит 0. 33 установит бит 1. Похоже, что он делает круговое смещение после 0-31 снова начинается с 0.

Зарегистрируйтесь в 64-битной ширине.

Есть идеи, как мне установить этот бит?

Например:

reg_addr.val = FEATURE_REG;

printf(stdout, "Programming enable at address %x=%llx\n",
    reg_addr.val,reg_addr.val);

data.val = (1ULL << 46);

printf("Data value %llx\n",data.val);}

3 ответа

Решение

Если вы используете типы как uint32_t или uint64_t, печать выполняется правильно:

printf(stdout, "Programming enable at address %" PRIu32 "=%" PRIu64 "\n",reg_addr.addr, reg_addr.val);

предполагается, что reg_addr.addr имеет тип uint32_t, а тип reg_addr.val имеет тип uint64_t.

Ваш код правильный.

Вы должны убедиться, что 64-битные целочисленные типы правильно поддерживаются на вашей платформе:

printf("%zu %zu\n", sizeof 1ULL, sizeof data);

должен напечатать

8 8

Если это так, ошибка, вероятно, (как упоминается @pmg в комментариях) в том, как вы проверяете, установлен ли бит.

В новой редакции вы упомянули, что это регистр. Регистры ввода-вывода могут иметь особое поведение из-за их изменчивого свойства. Я предлагаю вам сначала проверить, чтобы установить немного с нормальным объектом.

Я надеюсь, что вы не проверяете вывод этой строки, чтобы сделать вывод, что переключение не выполнено правильно!?

printf (стандартный вывод, "Программирование включено по адресу%x=%llx\n", reg_addr.val,reg_addr.val);

Передача 64-битного значения два раза в printf, но использование%x (возможно, 32-битного) и%llx (64-битного) для вывода значений не будет работать. Я полагаю, вы хотели взять адрес reg_addr.val в качестве первого параметра!?

printf (стандартный вывод, "Программирование включено по адресу%x=%llx\n", ®_addr.val,reg_addr.val);

Другие вопросы по тегам