在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类型是无符号的
其实我是想问,是不是在VC++6.0中,在运算一个表示时,其中的每一步(加减乘除...)在执行时是不是有一个临时的缓存区去存储这一步的结果,如果有,那么是多大,如果没有,那么为什么a值在执行128*2溢出时,再除3又会恢复!!
追答char类型进行运算的时候会进行类型的提升,即,那个128在运算的过程中就不是char型了,我记得会把char型提升到int型,所以不存在溢出的情况
可以看下这篇文章http://wenku.baidu.com/view/ef35d7ecaeaad1f346933fed.html
是不是说,那个存放数据的临时缓存区大小为int类型的更直接了?
追答刚看到一篇文章说c语言对于char是有符号还是无符号没有硬性规定,也就是说得看你编译器。
至于你说的临时缓存区,你也可以先这样理解。相差不大。
char 确实是到128,但是在printf中有个输出格式 %d表示输出整形。此时输出的值并不受char的影响,所以能输出256,不是说char a = 256,而是int a = 2 * char a;
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