【问题标题】:Typecast an unsigned int to unsigned long int C++将 unsigned int 类型转换为 unsigned long int C++
【发布时间】:2013-11-19 05:34:03
【问题描述】:

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

unsigned long address;

我正在使用

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

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

unsigned int address;

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

function(address);

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

【问题讨论】:

  • 问你怎么样?
  • 它是这样的,虽然无法从终端复制确切的东西。警告:格式 %x 需要类型 unsigned inta,但参数 5 的类型为 long unsigned inta
  • @user2958473 现在试着考虑一下。这都是关于严格的别名。请参阅我的答案以获得解释。

标签: c++ c


【解决方案1】:

将地址传递给fscanf() 时,类型必须与格式说明符完全匹配。当您使用%x 时,您声明您将传递一个指向unsigned int 的指针。如果您想将指针传递给 unsigned long,则需要改用格式说明符 %lx

if (fscanf(pFile, "%lx", &address) == 1) {
    // ...
}

(如果不检查输入是否成功,我就无法使用输入函数...)。

【讨论】:

  • @user2958473:我假设您尝试了"%lx" 而不是"%ls",因为后者实际上不应该工作(应用于格式说明符sl 修饰符意味着对应目标点所指向的字符串的类型是 wchar_t*,而不是通常情况下的 char*
  • 哦,是的。我的意思是%lx。谢谢。
【解决方案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

【讨论】:

  • @user2958473 不客气。 (真的是%ls吗?我不这么认为……)
【解决方案3】:

在 C 中你可以这样做

function((unsigned long)address);

【讨论】:

  • 但他为什么要这么做?
  • @H2CO3;因为他想做。我想到了隐式提升。 :)
猜你喜欢
  • 2016-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多