
简单的C语言题,求解释!!!
在VC++6.0上,int类型最大整数大约为21亿左右,char类型最大值为128,那么下面程序输出什么?请解释!#include<stdio.h>intmain(){i...
在VC++6.0上,int 类型最大整数大约为21亿左右,char类型最大值为128,那么下面程序输出什么?请解释!
#include <stdio.h>
int main()
{
int b = 2100000000 * 2 / 3;
char a = 128 *2 /3;
printf("a = %d, b = %d\n", a, b);
return 0;
} 展开
#include <stdio.h>
int main()
{
int b = 2100000000 * 2 / 3;
char a = 128 *2 /3;
printf("a = %d, b = %d\n", a, b);
return 0;
} 展开
5个回答
展开全部
更多追问追答
追问
嗯 你很聪明,但是我需要的是b的值
追答
怎么我算出来不对啊,奇怪啊,是不是和计算机里面的补码什么的有关系,不是计算器里面 的 除法也是用的加法和移位来算的么
展开全部
额,这个属实比较绕。
21 0000 0000 * 2 = 42 0000 0000;这时候已经溢出了(由于是有符号数),这时候计算机中存储这个数的值是FA 56 EA 00 (原码);
由于是有符号数,计算机读出来就读成了FA 56 EA 00(补码),
根据负数的补码等于其反码+1,符号位不变,那实际上这个数的原码又是85 A9 16 00 ,高位是符号位,
所以这个数就是负的05 A9 16 00即-94967296,
再把这个数除以3,得到-31655765.3333 ,
由于是整型,所以取整,得到-31655765
char进行运算的时候,会先进行类型提升,记得是提升到整型。
char 是无符号还是有符号得看定义,有些处理器默认是无符号的,这在下位机比较多,上位机的char一般都指有符号的。
21 0000 0000 * 2 = 42 0000 0000;这时候已经溢出了(由于是有符号数),这时候计算机中存储这个数的值是FA 56 EA 00 (原码);
由于是有符号数,计算机读出来就读成了FA 56 EA 00(补码),
根据负数的补码等于其反码+1,符号位不变,那实际上这个数的原码又是85 A9 16 00 ,高位是符号位,
所以这个数就是负的05 A9 16 00即-94967296,
再把这个数除以3,得到-31655765.3333 ,
由于是整型,所以取整,得到-31655765
char进行运算的时候,会先进行类型提升,记得是提升到整型。
char 是无符号还是有符号得看定义,有些处理器默认是无符号的,这在下位机比较多,上位机的char一般都指有符号的。
更多追问追答
追问
其实我是想问,是不是在VC++6.0中,在运算一个表示时,其中的每一步(加减乘除...)在执行时是不是有一个临时的缓存区去存储这一步的结果,如果有,那么是多大,如果没有,那么为什么a值在执行128*2溢出时,再除3又会恢复!!
追答
char类型进行运算的时候会进行类型的提升,即,那个128在运算的过程中就不是char型了,我记得会把char型提升到int型,所以不存在溢出的情况
可以看下这篇文章http://wenku.baidu.com/view/ef35d7ecaeaad1f346933fed.html
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
char 确实是到128,但是在printf中有个输出格式 %d表示输出整形。此时输出的值并不受char的影响,所以能输出256,不是说char a = 256,而是int a = 2 * char a;
int b = 2100000000 * 2 / 3;
char a = 128 *2 /3;
printf("sizeof(a) = %d, sizeof(b) = %d\n", sizeof(a), sizeof(b));
printf("a = %d, b = %d\n", a, b);
printf("2100000000 * 2 = %d\n",2100000000*2); // 4200000000 溢出变成负数
printf("128 * 2 = %d\n",128 * 2); // 由于输出格式是%d int形,所以没有溢出
return 0;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
a = 85, b = -31655765
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询