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

Tom*_*Tom 0 c++ unsigned struct pointers uint8t

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

\n
#include <iostream>\nusing namespace std;\n\nstruct DataSet\n{\n    char  data1;\n    int   data2;\n    char  data3;\n    short data4;\n};\n\nint main(void)\n{\n    struct DataSet data;\n\n    data.data1  = 0x11;\n    data.data2  = 0XFFFFEEEE;\n    data.data3  = 0x22;\n    data.data4  = 0xABCD;\n\n    uint8_t *ptr;\n    ptr = (uint8_t*)&data;\n\n    uint32_t totalSize = sizeof(struct DataSet);\n    \n    for(uint32_t i = 0 ; i < totalSize ; i++)\n    {\n        cout<<hex<<unsigned(ptr)<<endl;  // Here i get error.So how can i print these addresses using uint8_t.\n        ptr++;\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Ian*_*Ian 6

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

cout<<hex<<unsigned(ptr)<<endl;
Run Code Online (Sandbox Code Playgroud)

cout << hex << (uintptr_t) ptr << std::endl;
Run Code Online (Sandbox Code Playgroud)

打印地址。

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

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;
Run Code Online (Sandbox Code Playgroud)

输出是:

sizeof(uintptr_t) = 8
sizeof(uint8_t*) = 8                                                                                                                                                                                                                                                                                                                     
sizeof(unsigned int) = 4   
Run Code Online (Sandbox Code Playgroud)

指针大小为 8 字节,而您的unsigned int类型只有 4 字节大小。这就是出现此错误的原因。高8字节被截断,地址不正确。