pretty code

2019年7月19日 星期五

LShiftU64 釋疑

原本以為 LShiftU64 是我們自己寫的函數,後來才發現是 Library\BaseLib 裡面的函數,看了一下說明,跟直接使用 Standard C 操作似乎並沒兩樣?

我唯一能想到的合理解釋就是為了方便 porting,例如為了 32bit 的執行檔,只是不知道這樣是否真有意義?反正我對這行業的 Code 早已經見怪不怪了XD


#include <stdio.h>
#include <Library/BaseLib.h>

int main(void)
{
    unsigned long long a = 0x0000000000000001;
    
    UINT64 b = LShiftU64(a, 2);
    UINT64 c = a << 2;
    
    printf("UEFI 0x%016llX, 0x%016llX \n", a, b);
    printf("StdC 0x%016llX, 0x%016llX \n", a, c);
    
    return 0;
}
執行結果

UEFI 0x0000000000000001, 0x0000000000000004 
StdC 0x0000000000000001, 0x0000000000000004 


後記
似乎真的是跟 porting 有關,在網路上找到 2 篇相關文章。

[edk2] [Patch] MdeModulePkg: use LShiftU64() instead of "<<" to avoid IA32 build error.
Fix ScsiLib build break by << operator, which is replaced by LShiftU64 of BaseLib.

沒有留言: