Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C/C++;:如何正确转换;无符号整数*”;对“的价值”;无符号整数“;?_C++_C_Memory_Unsigned_Unsigned Integer - Fatal编程技术网

C++ C/C++;:如何正确转换;无符号整数*”;对“的价值”;无符号整数“;?

C++ C/C++;:如何正确转换;无符号整数*”;对“的价值”;无符号整数“;?,c++,c,memory,unsigned,unsigned-integer,C++,C,Memory,Unsigned,Unsigned Integer,我有一个“unsigned int*”值,我需要将它转换为一个简单的“unsigned int”, 所以我可以把它转换成一个函数。但不幸的是, 当我尝试执行简单强制转换时,值会发生更改: Code: unsigned int * addr; ... fprintf(stdout, "=== addr: %08x ===\n", addr); fflush(stdout); fprintf(stdout, "=== casted addr: %08x ===\n", (unsigned in

我有一个“unsigned int*”值,我需要将它转换为一个简单的“unsigned int”, 所以我可以把它转换成一个函数。但不幸的是, 当我尝试执行简单强制转换时,值会发生更改:

Code:

unsigned int * addr;

...

fprintf(stdout, "=== addr: %08x ===\n", addr); fflush(stdout);
fprintf(stdout, "=== casted addr: %08x ===\n", (unsigned int)addr);


Output:

=== addr: fc880000 ===
=== casted addr: 400eff20 ===

请告诉我,如何正确转换此值,使其在转换过程中不发生变化?

只需使用
*addr
。这是有效的,应该始终有效。如果需要获取指针的,而不是指针指向的值,则需要更大的类型。通常,
无符号整数*
的值为64位,而
无符号整数
的值仅为32位

unsigned int * addr;
该指针的值将是它指向的
无符号int
的地址

当您想要获取无符号整数的值时,它指向您使用解引用运算符
*

unsigned int value = *addr;

因此,您在第二个输出行中看到的是
addr
指向的内容。

如果您有某个类型的指针,并且需要将其转换为该类型,则只需遵从该指针即可

void foo(unsigned int some_value);

...

int main()
{

    unsigned int * addr = 0x12345678; // some address holding an unsigned int
    foo(*addr);  // some function taking a unsigned int
不需要在此处进行任何类型转换,因为您没有更改类型。请注意,代码中的“值”不变:

// prints the address
fprintf(stdout, "=== addr: %08x ===\n", addr); 

// prints the value at that address
fprintf(stdout, "=== casted addr: %08x ===\n", *(unsigned int *)addr);

您没有更改该值。在

fprintf(stdout, "=== addr: %08x ===\n", addr); fflush(stdout); 
您正在访问指针的地址


您正在访问指向的值。

…没有C/C++您正在使用哪一个?您正在打印两个不同的变量:
addr
address
@迈克C,但是C++解决方案也很有趣。为什么要键入指针?指针可以像任何其他变量一样传递给函数。还要记住,指针的大小和无符号整数的大小不一定是相同的。好吧,就像人们说的那样,去引用你的指针,比如fprintf(stdout,“==casted addr:%08x===\n”,“无符号整数”(*addr));非常感谢你!似乎我需要一个更大的类型。强制转换(长无符号int)工作得很好!我不会说int的大小通常是32。特别是在当今有大量64位系统的情况下,有两种标准的整数类型专门用于保存指针值:
intptr\u t
uintptr\u t
,这取决于您希望整数值是有符号的还是无符号的。根据平台的具体情况,其他任何东西都不能保证大小正确。@LokiAstari:
int
在您可能遇到的任何32或64位平台上都是32位的,因此可以公平地称之为“典型”。
fprintf(stdout, "=== casted addr: %08x ===\n", *(unsigned int *)address);