鱼C论坛

 找回密码
 立即注册
查看: 2113|回复: 9

[已解决]C语言a+b的结果在哪里存储,存储类型是什么

[复制链接]
发表于 2017-10-24 13:44:40 | 显示全部楼层 |阅读模式

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

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

x
# include <stdio.h>
int main (void)
{
        int a = 1, b = 2;
        printf ("sum = %d\n", a + b);     //a + b 的结果放在了哪里,类型是 int 么

        return 0;
}


a + b 的结果放在了哪里,类型是 int 么,如果他们的结果大于int,
是强制赋给他们其中任何一个long类型还是两个都要强制赋类型(举例 (long)a+b 或 (long)(a + b))这两个都对还是只有一个对哪个对
最佳答案
2017-10-24 19:34:13
hacker.jin 发表于 2017-10-24 17:21
不点,不点,他就是不点,还有好多好多好多问题要问你呢

啊呀,你可气死我了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-10-24 14:05:57 | 显示全部楼层
放在一个通用寄存器,就是内存的某个地址里。 是int类型,因为你打印语句里已经强制要求了答应的类型是%d,就是int型,要是大于int,你可以输出类型改为 %ld。
(long)a+b :强制把a转换为long,
(long)(a + b):强制把a+b的结果转换为long,和输出类型相似。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-24 14:46:37 | 显示全部楼层
丶忘却的年少o 发表于 2017-10-24 14:05
放在一个通用寄存器,就是内存的某个地址里。 是int类型,因为你打印语句里已经强制要求了答应的类型是%d, ...

谢谢,非常感谢
我还有个问题

# include <stdio.h>
int main (void)
{
        int a, b;
        unsigned long sum;
        a = 200000;
        b = 6000;
        sum = a * b;  //这里我需要强制改动 a , b 的类型么,例如 sum = (unsigned long)(a * b)
        printf ("sum = %u\n", sum);  //%(这里放u还是d都是相同的值)

        return 0;
}
按理说如果我不强制改动 a * b 的类型,这样会丢位,但实际上打印出来的结果却没有,怎么回事,是我没有
写对么?




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

使用道具 举报

发表于 2017-10-24 15:13:26 | 显示全部楼层
wyuri 发表于 2017-10-24 14:46
谢谢,非常感谢
我还有个问题

因为接受的sum是unsighed long,这个sum的位数足够存放a*b,但是后面要用%u,u的意思是无符号整形,范围是从0—2^32,可以放的下,但是%d是有符号,是%u范围/2,就存不下了。
对了,你的程序,不用unsigned也是正常的,因为算出来12*10^8,int类型最大是2^32-1,完全可以存放,把a改成500000再测试,你就能试出来了。注意范围哦!
麻烦点下“最佳答案”
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-24 17:04:04 | 显示全部楼层
丶忘却的年少o 发表于 2017-10-24 15:13
因为接受的sum是unsighed long,这个sum的位数足够存放a*b,但是后面要用%u,u的意思是无符号整形,范围 ...

            还是稍微有点模糊,您说了 a * b 的结果是 int 类型,那么如果结果超出 int 类型,就会溢出,结果就会不准确。不准确的结果就会放到类型为 unsigned long 的 sum 里面,促使 sum 最后达到的结果是不准确的。
所以我在想是否需要改动程序为 sum = (unsignde long)(a * b)。

       还想如果把程序 sum = (unsignde long)(a * b) 改成 sum = (unsignde long)a * b 也就是这两个表达式互换可不可以。





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

使用道具 举报

发表于 2017-10-24 17:21:11 | 显示全部楼层
丶忘却的年少o 发表于 2017-10-24 15:13
因为接受的sum是unsighed long,这个sum的位数足够存放a*b,但是后面要用%u,u的意思是无符号整形,范围 ...

不点,不点,他就是不点,还有好多好多好多问题要问你呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-24 19:33:42 | 显示全部楼层
wyuri 发表于 2017-10-24 17:04
还是稍微有点模糊,您说了 a * b 的结果是 int 类型,那么如果结果超出 int 类型,就会溢出 ...

不不不,你理解错了。我的意思是sum你已经定义为unsigned int了对吧,虽然 a*b 的结果是int,但是存放这个结果的sum是unsigned int,所以可以理解为已经 (unsigned int)(a*b)。这里必须加(),因为是值的强行转换!所以sum是准确的。要是你把sum定义为int,那就真的不准确了!因为范围超了,计算机不会聪明的强制给你转换一个大的范围去存放的。
如果还是没办法理解那么我把声明和定义都加在一起:unsinged int sum = int a * int b,维持等式左右平衡的原则,计算机会处理为:unsinged int sum = (unsinged int)(int a * int b)。因为左边是老大,老大说要什么你后面就要给什么,就这个意思。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-24 19:34:13 | 显示全部楼层    本楼为最佳答案   
hacker.jin 发表于 2017-10-24 17:21
不点,不点,他就是不点,还有好多好多好多问题要问你呢

啊呀,你可气死我了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-24 21:47:35 From FishC Mobile | 显示全部楼层
谢谢,非常感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-24 21:53:26 | 显示全部楼层
wyuri 发表于 2017-10-24 21:47
谢谢,非常感谢

别误会,我说的是那个大神,不是你。你要是有不懂接着问,没事
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-11 00:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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