gpt4 book ai didi

c - 转换为 uint64 时 int32 或 32 位指针的意外符号扩展

转载 作者:太空狗 更新时间:2023-10-29 16:09:09 28 4
gpt4 key购买 nike

我使用 Visual Studio 2010 (cl.exe/W4) 将此代码编译为 C 文件:

int main( int argc, char *argv[] )
{
unsigned __int64 a = 0x00000000FFFFFFFF;
void *orig = (void *)0xFFFFFFFF;
unsigned __int64 b = (unsigned __int64)orig;
if( a != b )
printf( " problem\ta: %016I64X\tb: %016I64X\n", a, b );
return;
}

没有警告,结果是:

problem a: 00000000FFFFFFFF b: FFFFFFFFFFFFFFFF

我想 int orig = (int)0xFFFFFFFF 不会那么有争议,因为我没有将指针分配给整数。但是结果是一样的。

有人可以向我解释一下 C 标准中的什么地方提到 orig 是从 0xFFFFFFFF 到 0xFFFFFFFFFFFFFFFF 的符号扩展吗?

我假设 (unsigned __int64)orig 会变成 0x00000000FFFFFFFF。好像是先转换成有符号的__int64类型,然后才变成无符号的?

编辑:这个问题已经得到解答,因为指针是符号扩展的,这就是我在 gcc 和 msvc 中看到这种行为的原因。但是我不明白为什么当我做类似 (unsigned __int64)(int)0xF0000000 的事情时,它的符号会扩展到 0xFFFFFFFFF0000000 但 (unsigned __int64)0xF0000000 并没有显示什么我想要 0x00000000F0000000。

编辑:对上述编辑的回答。 (unsigned __int64)(int)0xF0000000 被符号扩展的原因是因为,正如用户 R 所指出的那样:

Conversion of a signed type (or any type) to an unsigned type always takes place via reduction modulo one plus the max value of the destination type.

(unsigned __int64)0xF0000000 中,0xF0000000 开始时是无符号整数类型,因为它不适合整数类型。接下来,已转换为无符号类型 unsigned __int64

所以对我来说,从中得到的收获是一个函数返回一个 32 位或 64 位指针作为 unsigned __int64 进行比较,我必须首先转换我的 32 位指针中的 32 位指针-bit 在提升为 unsigned __int64 之前应用到无符号类型。生成的代码如下所示(但是,您知道,更好):

unsigned __int64 functionidontcontrol( char * );
unsigned __int64 x;
void *y = thisisa32bitaddress;
x = functionidontcontrol(str);
if( x != (uintptr_t)y )



再次编辑:这是我在 C99 标准中找到的内容:6.3.1.3 有符号和无符号整数

  • 1 当整数类型的值转换为另一个整数时_Bool 以外的类型,如果该值可以用新的表示类型,它是不变的。
  • 2 否则,如果新类型是无符号的,则该值由反复比最大值加一或减一可以用新类型表示,直到值在新类型的范围。49)
  • 3 否则,新类型被签名且值不能被在其中代表;结果要么是实现定义的,要么是实现定义的信号被提出。
  • 49) 规则描述的是数学值的算术,而不是给定类型表达式的值。

最佳答案

将指针转换为整数是实现定义的。

Here gcc 是如何做到的,即如果整数类型大于指针类型,它会进行符号扩展(无论整数是有符号还是无符号,这都会发生,只是因为 gcc 决定实现它)。

大概 msvc 的行为相似。编辑,我在 MSDN 上能找到的最接近的东西是 this/this ,建议将 32 位指针转换为 64 位指针也进行符号扩展。

关于c - 转换为 uint64 时 int32 或 32 位指针的意外符号扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7677919/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com