gpt4 book ai didi

c - 当左移不等于乘以 2

转载 作者:太空狗 更新时间:2023-10-29 15:03:41 25 4
gpt4 key购买 nike

我尝试了 KR 练习 2.1 - 确定 long 的范围直接计算变量。

#include <stdio.h>
#include <limits.h>

int main()
{
unsigned short long_bits = sizeof( long ) * CHAR_BIT;
printf( "LONG_MAX = %ld\n", ( 1L << ( long_bits - 1 ) ) - 1 );
printf( "LONG_MIN = %ld\n", ( -1 ) * ( 1L << ( long_bits - 1 ) ) );
printf( "ULONG_MAX (1) = %lu\n", ( 1UL << long_bits ) - 1 ); // doesn't work

printf( "ULONG_MAX (2) = %lu\n", 2*( 1UL << ( long_bits - 1 ) ) - 1 ); // work
printf( "\n" );
}
  • ULONG_MAX (1) = 0是错误的,因为我想是左移溢出。
  • ULONG_MAX (2) = 18446744073709551615将最后一个左移替换为乘以 2 似乎是正确的。

所以看起来左移运算符会溢出,但乘法不会?这个中间计算吗2*( 1UL << ( long_bits - 1 ) ) 提升到超过long的某种类型?在我的机器中,longlong long完全相同(8 字节)。


编辑:正如 Lundin 指出的那样,ULONG_MAX 所需的一切是printf( "ULONG_MAX = %lu\n", ~0L );

在这种情况下使用左移会导致 UB,乘以 2 也可能是 UB(尽管情况 2 的结果看起来是正确的)。

最佳答案

仅当您左移的量小于类型的大小时,才会定义值左移的行为。因此,1UL << long_bits是未定义的行为,任何事情都可能发生,包括从你的 Nose 里飞出的 Sprite 。

n是我们正在使用的类型中的位数。在实践中,根据平台的不同,在这种情况下会发生两种行为:要么,左移 n或更多产品 0 (因为整个位模式被移出),或者左移以模 n 减少, 所以左移 n places 的行为类似于左移 0地方,产生1UL << 01 .

关于c - 当左移不等于乘以 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34309613/

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