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

Posted

技术标签:

【中文标题】错误:从“uint8_t* aka unsigned char*”转换为“unsigned int”会丢失精度 [-fpermissive]【英文标题】:error: cast from ‘uint8_t* aka unsigned char*’ to ‘unsigned int’ loses precision [-fpermissive]错误:从“uint8_t* aka unsigned char*”转换为“unsigned int”会丢失精度 [-fpermissive] 【发布时间】:2020-08-19 12:59:55 【问题描述】:

我想打印结构变量的成员元素的地址。当我尝试编译这个程序时,它给了我错误(错误:从'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++;
    

【问题讨论】:

您好汗,您能否为您的问题添加更多详细信息?例如,给出错误的确切行,您使用的编译器等。另外我建议在标签列表中添加 c++,因为它会使使用的语言更加明显 std::cout 有一个打印 void* 的重载,所以你应该转换到那个 解决转换问题后,您的代码将打印结构中每个字节的地址,而不仅仅是每个元素的首地址。 【参考方案1】:

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

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字节被截断,地址不正确。

【讨论】:

以上是关于错误:从“uint8_t* aka unsigned char*”转换为“unsigned int”会丢失精度 [-fpermissive]的主要内容,如果未能解决你的问题,请参考以下文章

如何从错误消息中确定 PostgreSQL 错误代码

如何从 Alamofire 错误中获取潜在错误?

错误边界不会从 apollo 客户端捕获错误

错误代码:从 Azure 流分析作业中采样数据时出现 BadArgument 错误消息

从 phantomjs 收到错误:错误:渲染时,已达到超时

解决“错误代码:1030。从存储引擎 MEMORY 收到错误 1“不允许操作””