Как установить 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);