错误:从“ uint8_t * {aka unsigned char *}”转换为“ unsigned int”会失去精度[-fpermissive]

问题描述

我要打印结构变量的成员元素的地址。当我尝试编译该程序时,它给我错误错误:从“ uint8_t * {aka unsigned char *}”转换为“ unsigned int”会失去精度[-fpermissive])。我正在使用https://www.onlinegdb.com/online_c++_compiler。注意:我正在使用unsigned(ptr)否则会给出一些ASCII字符。(如果我定义了指针变量uint16_t ptr; ptr =(uint16_t )&data;那么它也可以工作,但不适用于uint8_t。)

#include <iostream>
using namespace std;

struct DataSet
{
    char  data1;
    int   data2;
    char  data3;
    short data4;
};

int main(void)
{
    struct DataSet data;

    data.data1  = 0x11;
    data.data2  = 0XFFFFEEEE;
    data.data3  = 0x22;
    data.data4  = 0xABCD;

    uint8_t *ptr;
    ptr = (uint8_t*)&data;

    uint32_t totalSize = sizeof(struct DataSet);
    
    for(uint32_t i = 0 ; i < totalSize ; i++)
    {
        cout<<hex<<unsigned(ptr)<<endl;  // Here i get error.so how can i print these addresses using uint8_t.
        ptr++;
    }
}

解决方法

使用您提供的在线编译器并更改此行

cout<<hex<<unsigned(ptr)<<endl;

cout << hex << (uintptr_t) ptr << std::endl;

打印地址。

使用以下方法检查这些数据类型的大小时:

std::cout << "sizeof(uintptr_t) = " << sizeof(uintptr_t) << std::endl;
std::cout << "sizeof(unsigned int) = " << sizeof(uint8_t*) << std::endl;
std::cout << "sizeof(unsigned int) = " << sizeof(unsigned int) << std::endl;

输出为:

sizeof(uintptr_t) = 8
sizeof(uint8_t*) = 8                                                                                                                                                                                                                                                                                                                     
sizeof(unsigned int) = 4   

指针大小为8个字节,而您的unsigned int类型的大小仅为4个字节。这就是为什么出现此错误的原因。高8字节被切除,地址不正确。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...