鱼C论坛

 找回密码
 立即注册
查看: 185|回复: 8

[已解决]小白来了.5

[复制链接]
发表于 2024-8-17 16:16:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 希儿的 于 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 也是一样的结果
是超出范围导致不行了吗
最佳答案
2024-8-17 17:46:08
小甲鱼老师之前讲过,int 和long int 或者long long int对结果都是没有影响的。

因为结果不超过其取值范围。

int:-217483648~2147483647
long:-217483648~2147483647
long long:-9223372036854775808~9223372036854775807


复习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-8-17 16:17:31 | 显示全部楼层
小白同学,欢迎来到计算机的奇妙世界!让我们来解开这个“奇怪的问题”的神秘面纱。

首先,你的代码中使用了`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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-17 16:49:51 | 显示全部楼层
首先,你两个代码我没看出区别,是一样的;
其次,long long也好,const long也好,或者其他的什么long,什么ABCD long也好,都是变量,属于被赋值的一方,赋值的内容一样,打印出来的内容也就一样。如果你改一下等号右侧的内容,打印结果就会发生变化。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-17 17:10:36 | 显示全部楼层
William01 发表于 2024-8-17 16:49
首先,你两个代码我没看出区别,是一样的;
其次,long long也好,const long也好,或者其他的什么long, ...

抱歉抱歉,改了
复制粘贴就没看了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-17 17:13:48 | 显示全部楼层
@FishC 再帮我看看咯
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-17 17:31:10 | 显示全部楼层
希儿的 发表于 2024-8-17 17:10
抱歉抱歉,改了
复制粘贴就没看了

我有一个问题,为什么我在我的编辑器上输入你的代码会报错,好奇怪。
const int max = pow(2, sizeof(int) * 8) / 2 - 1;
SyntaxError: invalid syntax
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-17 17:38:05 | 显示全部楼层
William01 发表于 2024-8-17 17:31
我有一个问题,为什么我在我的编辑器上输入你的代码会报错,好奇怪。

这是C语言的代码
你用Python编译器去编译……
(Python:我****)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-17 17:44:25 | 显示全部楼层
三体人的智子 发表于 2024-8-17 17:38
这是C语言的代码
你用Python编译器去编译……
(Python:我****)

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-17 17:46:08 | 显示全部楼层    本楼为最佳答案   
小甲鱼老师之前讲过,int 和long int 或者long long int对结果都是没有影响的。

因为结果不超过其取值范围。

int:-217483648~2147483647
long:-217483648~2147483647
long long:-9223372036854775808~9223372036854775807


复习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 16:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表