>3);-6ren"> >3);-short x = -123; unsigned short y = -123; printf("%x\n", x>>3); printf("%x\n", y>>3); 结果是 fffffff0 1f-6ren">
gpt4 book ai didi

c - 短 x = -123; printf ("%x\n", x>>3);

转载 作者:太空宇宙 更新时间:2023-11-04 04:25:09 25 4
gpt4 key购买 nike

short x = -123;
unsigned short y = -123;

printf("%x\n", x>>3);
printf("%x\n", y>>3);

结果是

fffffff0
1ff0

我不明白第一个结果,因为 short 是 2 个字节,但结果是 4 个字节。

最佳答案

%x 格式说明符需要一个 unsigned int 参数。传递任何其他类型的参数 ( even int) 会导致未定义的行为。

您可以将代码修改为:

printf("%x\n", (unsigned int)(x>>3));
printf("%x\n", (unsigned int)(y>>3));

对于x >> 3,首先x进行整数提升。这会将 (short)-123 变成 (int)-123 因为促销是保值的。

然后 -123 >> 3 导致实现定义的行为。可能您的实现将其定义为 32 位整数中 2 的补码表示的算术右移:

-123:         11111111111111111111111110000101
-123 >> 3: 11111111111111111111111111110000

在 2 的补码中是 -16

最后,(unsigned int)-16 定义为 UINT_MAX - 150xFFFFFFFF - 15 给出 0xFFFFFFF0


对于 unsigned short y = -123; 行,-123 被转换为 unsigned short,为 y 赋值 在您的 USHRT_MAX - 122 系统上,即 65413。然后对于 y >> 3,这个值被提升为 int,保留值 65413。正数右移的定义是除以2那么多次。 65413/8 给出 8176,即十六进制的 1FF0

关于c - 短 x = -123; printf ("%x\n", x>>3);,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42431079/

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