我对编程有点新意。我有这个问题。我有一个变量
unsigned long address;
我正在使用
fscanf(pFile, "%x\n", &address);
从文件中读取此数据。该文件以十六进制(没有0x)将其转换为十进制并存储。所以我有点不愿意改变这一部分。当我使用g ++编译时,它要求我将地址更改为
unsigned int address;
现在,这个“地址”变量用在我将调用的函数中,其参数为“unsigned long”。所以,如果我“地址”为“unsigned int”,我该如何调用这个函数
function(address);
这样地址被转换为无符号长
答案 0 :(得分:4)
将地址传递给fscanf()
时,类型必须与格式说明符完全匹配。当您使用%x
时,您声明您将指向unsigned int
。如果您认为要将指针传递给unsigned long
,则需要使用格式说明符%lx
代替:
if (fscanf(pFile, "%lx", &address) == 1) {
// ...
}
(我不能在没有检查输入成功的情况下使用输入函数......)。
答案 1 :(得分:2)
你正在从错误的方向接近问题。
对指针进行操作时,不能仅通过指向其他类型的指针来对对象进行别名。 %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
答案 2 :(得分:0)
在C中你可以这样做
function((unsigned long)address);