[英]C++ difference between unsigned int and unsigned long int
[英]Typecast an unsigned int to unsigned long int C++
我對編程有點陌生。 我有這個問題。 我有一個變量
unsigned long address;
我正在使用
fscanf(pFile, "%x\n", &address);
從文件中讀取此數據。 該文件以Hex(無0x)格式存儲,並將其轉換為Decimal並存儲。 因此,我不太願意更改此部分。 當我使用g ++進行編譯時,它要求我將地址更改為
unsigned int address;
現在,此“地址”變量將在我將調用的函數中使用,該函數的參數為“無符號長整數”。 因此,如果我將“地址”設置為“ unsigned int”,該如何調用此函數
function(address);
這樣地址就被強制轉換成無符號的long
將地址傳遞給fscanf()
,類型必須與格式說明符完全匹配。 使用%x
您將聲明要傳遞一個指向unsigned int
的指針。 如果感覺要傳遞一個指向unsigned long
的指針,則需要使用格式說明符%lx
代替:
if (fscanf(pFile, "%lx", &address) == 1) {
// ...
}
(我不能在不檢查輸入是否成功的情況下使用輸入功能...)。
您正在從錯誤的方向解決問題。
當對指針進行操作時,不能僅僅通過指向其他類型的指針來為對象添加別名。 %x
轉換說明符指示scanf()
采取unsigned int *
,因此,如果將unsigned long
的地址傳遞給它,則會得到未定義的行為。 如果要掃描unsigned long
,請使用適當的修飾符:
unsigned long address;
scanf("%lx", &address);
但是,如果您確實希望將address
更改為unsigned int
,則無需執行其他任何操作-將unsigned int
傳遞給函數時,會將其隱式轉換為適當的類型(在這種情況下為unsigned long
) 。 不需要任何類型的轉換。 為了澄清,以下代碼是正確的:
void foo(unsigned long n) { }
unsigned int address;
scanf("%x", &address);
foo(address); // implicit conversion happens
在C中,您可以
function((unsigned long)address);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.