Я хотел бы создать макросы для бинарных вращений.Моя цель состояла в том, чтобы сделать эти макросы универсальными для типов операндов uint32_t
и uint64_t
.
Я пришел к этой реализации:
#define ROTL(X, N) (((X) << (N)) | ((X) >> (8 * sizeof(X) - (N))))
#define ROTR(X, N) (((X) >> (N)) | ((X) << (8 * sizeof(X) - (N))))
Эти макросы работают нормально, но компилятор gcc
выдает предупреждения во время компиляции:
warning: right shift count >= width of type [enabled by default]
#define ROTL(X, N) (((X) << (N)) | ((X) >> (8 * sizeof(X) - (N))))
warning: left shift count >= width of type [enabled by default]
#define ROTL(X, N) (((X) << (N)) | ((X) >> (8 * sizeof(X) - (N))))
Я знаю, что компилятор жалуется на возможное несоответствие между типами X
и N
.Но предупреждения выдаются, даже когда я разыграю X
и N
:
ROTL((uint32_t)0xdeadbeef, (uint32_t)0U);
Что я могу сделать, чтобы избавиться от этих предупреждений правильным способом?