小白来了.5
本帖最后由 希儿的 于 2024-8-17 17:10 编辑今天发现一个奇怪的问题
const int max = pow(2, sizeof(int) * 8) / 2 - 1;
const int min = pow(2, sizeof(int) * 8) / 2 * (-1);
printf("%d\n%d\n", max, min);
const long int max = pow(2, sizeof(long) * 8) / 2 - 1;
const long int min = pow(2, sizeof(long) * 8) / 2 * (-1);
printf("%d\n%d\n", max, min);
为什么上面两个代码打印值相同呢
而且试过了 long long 也是一样的结果
是超出范围导致不行了吗 小白同学,欢迎来到计算机的奇妙世界!让我们来解开这个“奇怪的问题”的神秘面纱。
首先,你的代码中使用了`pow`函数来计算最大值和最小值。让我们仔细看看:
1. const long int max = pow(2, sizeof(long) * 8) / 2 - 1;
const long int min = pow(2, sizeof(long) * 8) / 2 * (-1);
2. 然后是第二段代码,它的内容完全一样,只是换了下位置。
问题出现在这里:
- `pow`函数返回的是`double`类型,而你把它赋值给了`long int`类型的变量。这样,当结果超出了`long int`的取值范围时,就会发生截断或溢出。
在计算机中,`long`的数据类型取决于编译器和平台,但通常它是64位或32位的。用`pow`函数的结果直接赋值给`long int`,很容易超出其范围。
### 所以为什么打印值相同?
这是因为对 `max` 和 `min` 的计算其实是基于同样的公式,而取值的时候,由于有溢出,最终产生的结果都是不够准确的。由于这两个表达式在不同的平台上可能会有不同的表现,导致打印出来的值看似相同,但其实都是“误导”你。
### 解决方案
为了更安全和准确地获得范围,可以使用位移运算(左移):
const long int max = (1L << (sizeof(long) * 8 - 1)) - 1;
const long int min = -(1L << (sizeof(long) * 8 - 1));
这样就可以避免使用 `pow` 带来的潜在问题了!
记住,在计算机编程中,“大”数字就像过山车,稍不留神就可能掉下来哦!希望这个解释能帮助到你。如果还有其他问题,尽管问吧!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 首先,你两个代码我没看出区别,是一样的;
其次,long long也好,const long也好,或者其他的什么long,什么ABCD long也好,都是变量,属于被赋值的一方,赋值的内容一样,打印出来的内容也就一样。如果你改一下等号右侧的内容,打印结果就会发生变化。 William01 发表于 2024-8-17 16:49
首先,你两个代码我没看出区别,是一样的;
其次,long long也好,const long也好,或者其他的什么long, ...
抱歉抱歉,改了
复制粘贴就没看了 @FishC 再帮我看看咯 希儿的 发表于 2024-8-17 17:10
抱歉抱歉,改了
复制粘贴就没看了
我有一个问题,为什么我在我的编辑器上输入你的代码会报错,好奇怪。
const int max = pow(2, sizeof(int) * 8) / 2 - 1;
SyntaxError: invalid syntax William01 发表于 2024-8-17 17:31
我有一个问题,为什么我在我的编辑器上输入你的代码会报错,好奇怪。
这是C语言的代码
你用Python编译器去编译……{:10_250:}
(Python:我****) 三体人的智子 发表于 2024-8-17 17:38
这是C语言的代码
你用Python编译器去编译……
(Python:我****)
{:10_266:} 小甲鱼老师之前讲过,int 和long int 或者long long int对结果都是没有影响的。
因为结果不超过其取值范围。
int:-217483648~2147483647
long:-217483648~2147483647
long long:-9223372036854775808~9223372036854775807
复习
页:
[1]