【问题标题】:how this convertion done in c++ from unsigned char* to unsigned short? x= (unsigned char*)&x - (unsigned char*) 0x8888;如何在 C++ 中完成从 unsigned char* 到 unsigned short 的转换? x= (unsigned char*)&x - (unsigned char*) 0x8888;
【发布时间】:2017-02-13 17:03:07
【问题描述】:

这种从 unsigned char* 到 unsigned short 的转换是如何完成的?

#include<iostream>
using namespace std;

int main()
{
    unsigned short x;
    x= (unsigned char*)&x - (unsigned char*) 0x8888;
    cout<<us<<endl;
    return 0;
}

当我尝试像这样添加时

x= (unsigned char*)&x + (unsigned char*) 0x8888;

然后出现错误。它说“'unsigned char*'和'unsigned char*'类型的无效操作数到二进制'operator+'”请帮助我理解这个语法。

【问题讨论】:

  • 你为什么要这样做?
  • 您的代码中没有从unsigned char *unsigned short 的转换。减法的优先级高于赋值。

标签: c++


【解决方案1】:

可以对两种地址数据类型进行减法运算,但不能进行加法运算。
另外,+ 的两个操作数都应为算术类型,或者一个操作数应为指针,另一个应为整数类型。

C++11-§ 5.7/1:

另外,两个操作数都应具有算术或无作用域枚举类型,或者一个操作数应是指向完全定义的对象类型的指针,而另一个应具有整数或无作用域枚举类型。

【讨论】:

  • 兄弟这不起作用 x= (unsigned char*)&x + 88 我已将第二个操作数更改为 int。
  • 我正在尝试此代码“x= (unsigned char*)&x + 88”。然后“错误:从'short unsigned int*'到'short unsigned int'[-fpermissive]|的无效转换”
  • (unsigned char*)&amp;x + 88 将给出 unsigned char* 值。 xunsigned short 类型。错误/警告是合法的。
  • x= (unsigned short*)&x + 88;我将 (unsigned char*) 更改为 (unsigned short*) 然后“错误:从 'short unsigned int*' 到 'short unsigned int' [-fpermissive]| 的无效转换”
  • 你知道指针和int数据类型的区别吗?
【解决方案2】:

您可以使用cstdint C++11 将指针转换为int/short/long,如下所示,但我不确定是否建议添加@haccks 提到的指针

#include<iostream>
#include <cstdint>

using namespace std;

int main()
{
    unsigned short x;
    //x= (unsigned char*)&x + (unsigned char*) 0x8888;
    x = static_cast<unsigned short>(reinterpret_cast<uintptr_t>(&x)) + static_cast<unsigned short>(0x8888);
    cout<<x<<endl;
    return 0;
}

请参阅此link 了解更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    相关资源
    最近更新 更多