简单的C语言题,求解释!!!

在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;
}

a = 85, b = -31655765

85就不用解释了吧,因为 char类型无符号,所以8位全部表示字符,128只占7位,乘2后变为256,再除以3 128*2/3 = 85.333333333333333333333333333333 小数部分舍去了。


b呢是整形 有符号,最高位表示符号 b * 2 = 4200000000 = 11111010010101101110101000000000 = -2052516352 /3 = -684172117

追问

嗯 你很聪明,但是我需要的是b的值

追答

怎么我算出来不对啊,奇怪啊,是不是和计算机里面的补码什么的有关系,不是计算器里面 的 除法也是用的加法和移位来算的么

追问

在此我想再弱弱的问一句,是谁说的char类型是无符号的啊,如果有证据证明,请指出

追答

.其实我是想问,是不是在VC++6.0中,在运算一个表示时,其中的每一步(加减乘除...)在执行时是不是有一个临时的缓存区去存储这一步的结果,如果有,那么是多大,如果没有,那么为什么a值在执行128*2溢出时,再除3又会恢复!!

关于这个问题要从汇编角度来解释,16位汇编里面 寄存器有 AX BX CX DX都是16位 ,其中AX可分为 AH AL 高位和低位 当进行乘法计算时 al * bl 会存在溢出 ,此时便会将乘完结果的高位放到 AH 低位放到AL ,16位汇编就是这样,32位的大概也是如此,你可以看下上面程序的反汇编

关于char符号的问题,个人认为char是无符号的,asic码只用到了8位中的低7位,关于第8位是0还是1没要求,所以char类型是无符号的

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-09-05
额,这个属实比较绕。
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

追问

是不是说,那个存放数据的临时缓存区大小为int类型的更直接了?

追答

刚看到一篇文章说c语言对于char是有符号还是无符号没有硬性规定,也就是说得看你编译器。
至于你说的临时缓存区,你也可以先这样理解。相差不大。

本回答被提问者采纳
第2个回答  2013-09-05

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;

第3个回答  2013-09-05

第4个回答  2013-09-05
a = 85, b = -31655765

C语言的题,都不难,帮忙解答,追加悬赏喔。麻烦把各个选项都解释解释最好...
这个union是表示,一块储存空间用short,long,char,三种类型来描述,所以c[0] 与i[0]一样的。这个程序是要打印s->c[0],printf("%x\\n", s ->c[0])这句里的%x表示打印的数字是十六进制的。由于c[0]里面放的是0x39,所以这里打印的正好是39.第三题:与第二题类似,注意这里求的是them的...

C语言问题,求原因解!
第一个printf()输出194就是说数组a的首地址是十六进制的194 p+9就是指向0的位置,a中每一个元素占用2个字节,那么从a的开始到0共占用2*9 = 18个字节18的十六进制是12,所以194 + 12 = 1a6故选D

一道c语言的计算题。求细致一点的讲解~~~追加!!
题目:输入两个整数 x 和 y,求它们的和、差、积、商、余数。这是一道比较基础的 C 语言计算题目,可以通过输入两个整数,然后使用加、减、乘、除等运算符进行计算,最后输出结果。下面是一份示例代码,给你参考:include <stdio.h> int main() {int x, y;printf("请输入两个整数:\\n");sc...

c语言题目,求解惑
2d是C语言中printf函数的输出格式说明符。具体解释如下:使输出的int型的数值以2位的固定位宽输出。如果不足2位,则在前面补空格;如果超过2位,则按实际位数输出。注:如果输出的数值不是int型,则进行强制类型转换为int,之后按上面的格式输出。举例如下:printf("%2d", 12); \/\/ 输出12 printf...

c语言简单程序题把我搞糊涂了 求大佬解疑
第一张图片:根据优先级,先算++,但由于加加在后面,所以返回加加前的值,也就是7。再算等号,赋值给sum,此时sum就是7。然后轮到逗号,逗号之后是sum自加,得8。然后再到下一个num自加,但跟sum已经没有关系了。所以答案是8。第二张图片:由于括号的原因,等号优先级低,所以先算括号里的值...

一道C语言问题 麻烦帮我解释一下!
char x=123; 该句将x初始化为ASC码值为123的字符。开始循环时,x存放字符的ASC码值为123,因此x%10=3,从而x%10+'0'即为3加“字符0对应的ASC码值”,由于ASC码表里数字0到9是按顺序排放的,因此3加“字符0对应的ASC码值”得到的是字符3的ASC码值,而printf按照%c的字符方式输出,那么...

一道c语言题目 求大神指点下算法?
根据题意,随机生成红绿蓝球任意个数,并任意顺序排列。这里采用随机数实现。统计按红绿蓝顺序排列最少交换次数,我的思路是:第一步:循环将最后一个红色球与最靠前的其它两色球(并且满足位置在红球之前)交换。第二步:循环将最后一个绿球与最靠前的蓝球(必须在绿球之前)交换。include <stdio.h> ...

C语言问题,求解。。。最好有过程和说明,谢谢!
=3+add(p+1+1+1,3-1)当n=2时,add(p+1,3-1)就等于*p[3]+add(p+1,3-1)=4+add(p+1+1+1+1,3-1)当n=1时,add(p+1,2-1)就等于*p[5]=5 所以将add一次带回当5时*p+add(p+1,n-1)=*p[0]+*p[1]*+p2]*+p[3]*+p[4]*+p[5]=1+2+3+4+5=15 ...

求解C语言基础题。
一、平台:数组中连续相等的元素就是一个平台。二、最长平台:就是在所有平台中找出最长的那个。三、方法不止一种,从完整程序思路,至少包含一个实现功能的函数及打印输出的函数。下面是我写的演示代码:遍历数组,找出最长平台,返回其在数组中起点和终点位置(返回值是指针数组)。异常直接抛出自行处理...

C语言问题 int a=3,求a++*a 要解释过程!
a++*a 值为9 ++运算符比 *(乘号)优先级高 相当于(a++)*a a++的值为 3(你不要误以为下一个a的值会变为4, 一般情况下有后++的, 当这条语句完成后其值才会改变, 更编译器有一定关系)故结果为9

相似回答
大家正在搜