gpt4 book ai didi

c - 为什么 ((unsigned char)0x80) << 24 将符号扩展为 0xFFFFFFFF80000000(64 位)?

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

下面的程序

#include <inttypes.h> /*  printf(" %" PRIu32 "\n"), my_uint32_t) */
#include <stdio.h> /* printf(), perror() */

int main(int argc, char *argv[])
{
uint64_t u64 = ((unsigned char)0x80) << 24;
printf("%" PRIX64 "\n", u64);

/* uint64_t */ u64 = ((unsigned int)0x80) << 24;
printf("%016" PRIX64 "\n", u64);
}

产生

FFFFFFFF80000000
0000000080000000

((unsigned char)0x80) 之间有什么区别?和 ((unsigned int)0x80)在这种情况下?

我猜 (unsigned char)0x80晋升为 (unsigned char)0xFFFFFFFFFFFFFF80然后是移位,但为什么这个转换认为 unsigned char签到了吗?

同样有趣的是 0x80 << 16产生预期的结果,0x0000000000800000 .

最佳答案

C 编译器在执行移位之前执行整数提升

标准的规则 6.3.1.1 说:

If an int can represent all values of the original type, the value is converted to an int; otherwise, it is converted to an unsigned int. These are called the integer promotions.

因为 unsigned char 的所有值都可以用 int 表示,0x80 被转换为有符号 int . unsigned int 的情况并非如此:它的一些值不能表示为 int,因此在应用整数提升后它仍然是 unsigned int .

关于c - 为什么 ((unsigned char)0x80) << 24 将符号扩展为 0xFFFFFFFF80000000(64 位)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29538935/

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