我对编程有点陌生。我有这个问题。我有一个可变
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);