C++ C/C++;:如何正确转换;无符号整数*”;对“的价值”;无符号整数“;?
我有一个“unsigned int*”值,我需要将它转换为一个简单的“unsigned int”, 所以我可以把它转换成一个函数。但不幸的是, 当我尝试执行简单强制转换时,值会发生更改: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
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);