类型转换为unsigned long int C ++的unsigned int

时间:2013-11-18 21:27:18

标签: c++ c

我对编程有点新意。我有这个问题。我有一个变量

unsigned long address;

我正在使用

fscanf(pFile, "%x\n", &address);

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

unsigned int address;

现在,这个“地址”变量用在我将调用的函数中,其参数为“unsigned long”。所以,如果我“地址”为“unsigned int”,我该如何调用这个函数

function(address);

这样地址被转换为无符号长

3 个答案:

答案 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);