将无符号int类型转换为无符号长int C++



我对编程有点陌生。我有这个问题。我有一个可变

unsigned long address;

我正在使用

fscanf(pFile, "%xn", &address);

从文件中读取此数据。该文件的十六进制(不含0x)将其转换为十进制并存储。所以我有点不愿意改变这个部分。当我使用g++编译时,它要求我将地址更改为

unsigned int address;

现在,这个"地址"变量用于我将调用的一个函数,该函数的参数为"unsigned long"。那么,如果我"address"为"unsigned int",我该如何调用这个函数

function(address);

使得地址被类型化为无符号长

将地址传递给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);

相关内容

最新更新