IRQn(((uint32_t)(int32_t)IRQn) >> 5UL)
は -14 から 81 までの範囲の列挙型です。
私が見る限り、最初に int32_t にキャストされ、次に uint32_t にキャストされます。その後、左にシフトします。最後に、(与えられたコード例の外で) 配列インデックスとして使用されます。
テストとして、次のコードを作成し、同じコンパイラでコンパイルしました。
int a=0, b=0, c=0, d=0;
a=-5;
b=(int32_t)a;
c=(uint32_t)b;
d=(uint32_t)a;
私が見る限り、4 つの数字はすべて末尾が同じ 2 進値になっています。((uint32_t)IRQn)
これは、キャストとしても機能しただろうと私に信じさせます。
では、キャストを 2 回行う必要がある他の理由はありますか?