wyuri 发表于 2017-10-24 13:44:40

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

# 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))这两个都对还是只有一个对哪个对

丶忘却的年少o 发表于 2017-10-24 14:05:57

放在一个通用寄存器,就是内存的某个地址里。 是int类型,因为你打印语句里已经强制要求了答应的类型是%d,就是int型,要是大于int,你可以输出类型改为 %ld。
(long)a+b :强制把a转换为long,
(long)(a + b):强制把a+b的结果转换为long,和输出类型相似。

wyuri 发表于 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 的类型,这样会丢位,但实际上打印出来的结果却没有,怎么回事,是我没有
写对么?




丶忘却的年少o 发表于 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再测试,你就能试出来了。注意范围哦!
麻烦点下“最佳答案”{:10_330:}

wyuri 发表于 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 也就是这两个表达式互换可不可以。





hacker.jin 发表于 2017-10-24 17:21:11

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

不点,不点,他就是不点,还有好多好多好多问题要问你呢{:5_108:}

丶忘却的年少o 发表于 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)。因为左边是老大,老大说要什么你后面就要给什么,就这个意思。

丶忘却的年少o 发表于 2017-10-24 19:34:13

hacker.jin 发表于 2017-10-24 17:21
不点,不点,他就是不点,还有好多好多好多问题要问你呢

啊呀,你可气死我了!{:10_273:}

wyuri 发表于 2017-10-24 21:47:35

谢谢,非常感谢

丶忘却的年少o 发表于 2017-10-24 21:53:26

wyuri 发表于 2017-10-24 21:47
谢谢,非常感谢

别误会,我说的是那个大神,不是你。你要是有不懂接着问,没事
页: [1]
查看完整版本: C语言a+b的结果在哪里存储,存储类型是什么