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

2021-07-26 11:17:45 字數 816 閱讀 9025

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.

邏輯運算最後計算。

C語言中的型別轉換

計算機進行算術運算時,通常要求運算元具有相同的位數 相同的儲存方式。而c語言支援在表示式中混合使用基本資料型別,因此需要在不同的資料型別之間進行轉換。在c語言中存在兩種型別的轉換,一種是隱式轉換,由編譯器自動處理轉換而無需程式開發人員介入,另一種是強制型別轉換 顯式轉換 需要程式開發人員使用強制轉換...

C語言中的型別轉換!

自動轉換發生在不同資料型別運算時,在編譯的時候自動完成 自動轉換遵循的規則就好比小盒子可以放進大盒子裡面一樣,下圖表示了型別自動轉換的規則。縮寫 ascii 英文全稱 american standard code for information interchange 美國資訊交換標準 是一種用於資...

C語言中的型別轉換

c語言中的型別轉換可以分為兩種 隱式轉換中的規則有 窄的向寬的轉變 unsigned 同型別無符號比有符號寬 同型別的轉換例如 int a 10 unsigned int b 10 if a b printf a b else printf a不同型別的轉換例如 int c 10 unsigned ...