1. 程式人生 > >c語言中32為地址型別轉換為64位整數型別

c語言中32為地址型別轉換為64位整數型別

uint64_t idt_operand = ((sizeof(idt) - 1) | ((uint64_t)(uint32_t)idt << 16));

idt是陣列名,也就是結構陣列型別的指標。static struct gate_desc idt[IDT_DESC_CNT];   // idt是中斷描述符表,本質上就是個中斷門描述符陣列

32位陣列指標要轉換成64位整型,不能一次性轉換,(uint64_t)idt會提示出錯:

idt_struct.c:57: 警告:將一個指標轉換為大小不同的整數

安裝運算子優先順序,先進行指標型別轉換為整型(uint32_t)idt,

然後進行32位整型轉換成64位整型(uint64_t)(uint32_t)idt,

然後是64位整型左移16位。(uint64_t)(uint32_t)idt << 16,

然後是按位或((sizeof(idt) - 1) | ((uint64_t)(uint32_t)idt << 16))。

注意:(sizeof(idt) - 1)不是struct的二進位制位數(64位),是陣列idt[32]的大小,不會超過16位2進位制能表示的最大值,2的16次冪是65536,即64K位元組。

基本的優先順序需要記住: 指標最優,單目運算優於雙目運算。如正負號。 先乘除(模),後加減。 先算術運算,後移位運算,最後位運算。請特別注意:1 << 3 + 2 & 7等價於 (1 << (3 + 2))&7. 邏輯運算最後計算。