1楼:天云一号
因为只能是int转换为float型,而不能反过来,可以理解为float型级别比int型高,c语言规定数据只能从低级别转换到高级别,如int a=3; printf("%f\n",a);输出就是3.0
你题目中的输出相当于是乱码了
c语言问题
2楼:一个能通过的名
首先你的scanf语句不对,应该是:scanf("%lf %lf", &a, &b),正确格式是:scanf("《格式化字符串》",《地址表》);
你的printf语句应该是:printf("得到一个和为%f + %f = %f\n" ,a,b,a+b);,正确格式是:printf("输出格式类型",变量),前面的输出格式类型的数量,要和变量的数量一样
3楼:
printf("得到一个和为%f + %f = %f\n", a+b);
你写了三个占位符%f,为什么后面只有一个值对应?
请把a、b、a+b这三个值都写上去
另外,你的scanf为什么要把&a和&b写到引号里面?请改
c语言问题
4楼:匿名用户
首先我们计算mpll_val的值。这里涉及两个操作符<<(左移)和|(异或),都是二进制运算符。具体定义这里就不说了,可以自己查下。
mpll_val = (92<<12)|(1<<4)|(1);
92转换成二进制为01011100,将此数左移12位,也就是后面加12个0,变成01011100000000000000,转换成十进制为2^14+2^15+2^16+2^18 = 376832,
同理,1<<4转换成十进制为16,上面mpll_val = 376832|16|1,这个其实就相当于
376832+16+1(很简单,知道了异或的规则用二进制计算就知道了)。因此:
mpll_val = 376849
下面的rmpllcon的值计算需要理解三个概念:函数,参数,异与操作符
函数指的的就是void changempllvalue(int mdiv,int pdiv,int sdiv);
参数指的是这个函数中定义的三个整型参数,在下面的具体声明中,也是这三个参数:
void changempllvalue(int mdiv,int pdiv,int sdiv)
最后实现过程changempllvalue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);这三个参数分别对应(mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3这三个值。
这里我们只将第一个参数的值(mpll_val>>12)&0xff是多少:
mpll_val我们刚才已经计算为376849,现在mpll_val>>12就是右移,与左移相反,等于我们又将mpll_val打回原形变成了92,那么下面我们计算92&0xff,这里我们需要知道0xff是一个十六进制数。
以0x开始的数据表示16进制,0xff换成十进制为255。
a,b,c,d,e,f这五个字母来分别表示10,11,12,13,14,15。
16进制变十进制:f表示15。第n位的权值为16的n次方,由右到左从0位起。
0xff = 15*16^1 + 15*16^0 = 255
16进制变二进制再变十进制:
0xff = 1111 1111 = 2^8 - 1 = 255
也就是92&255,用二进制表示就是
01011100
&11111111
=01011100
因此(mpll_val>>12)&0xff的值就是92,同理可以得出后面两个参数的值。最后代入
rmpllcon = (mdiv<<12) | (pdiv<<4) | sdiv;(计算得知mdiv = 92,pdiv = 1, sdiv = 1)
最后计算rmpllcon,你一定以为是376849,但是不是的,结果应该是没办法写入的,因为
#define rmpllcon (*(volatile unsigned *)0x4c000004) //mpll control
简单来说这句话就是定义rmpllcon为一个指向固定地址的常量,不是变量,具体参考http://blog.sina.
***.**/s/blog_65861d3f0100xsz0.html
最后,提供一个验证程序,自己调试看看吧:
#include
#include
voidchangempllvalue(intmdiv,intpdiv,intsdiv);
#definermpllcon(*(volatileunsigned*)0x4c000004) //mpllcontrol
intmain()
voidchangempllvalue(intmdiv,intpdiv,intsdiv)
5楼:
|mpll_val = 01011100<<12 | 00000001<<4 | 1 = 01011100000000000000 | 00010000 | 1 = 01011100000000010001 = 376849;
rmpllcon = ((01011100000000010001>>12)&0xff)<<12 | ((01011100000000010001>>4)&0x3f)<<4 | 01011100000000010001&3
= (01011100&11111111)<<12 | (0101110000000001&00111111)<<4 | 01011100000000010001&00000011
= 01011100<<12 | 00000001<<4 | 00000001
= 01011100000000000000 | 00010000 | 00000001
= 01011100000000010001
= 376849。
changempllvalue();没有值,因为它的返回值是void型。
不过这是假设地址0x4c000004允许访问的情况下的结果。一般情况下这个地址是系统保护的,不允许访问,所以你试不出来。这种写法也是不提倡的,因为很危险。
6楼:百度用户
n 越界了,超过了100.
似乎应当把 n=n+i 改成 n=n+1 或 n++还有其他问题:建议这样修改:
for(i=0;i<100;i++)
每输入两个数后回车,如 23,45 回车,最后输入 0,0 后回车,表示输入完毕
希望能解决您的问题。
7楼:
先看mpll_val的值
unsigned int类型是4个字节,92转换成二进制是
0000 0000 0000 0000 0000 0000 0101 1100
92<<12,这个意思是把92这个数按二进制位操作,左移12位,于是得到
0000 0000 0000 0101 1100 0000 0000 0000
同理1<<4,四字节二进制表示就是
0000 0000 0000 0000 0000 0000 0001 0000
(92<<12)|(1<<4),“|”这个是按位或运算符,就是把以下两个数按位或运算
0000 0000 0000 0101 1100 0000 0000 0000
0000 0000 0000 0000 0000 0000 0001 0000
结果是0000 0000 0000 0101 1100 0000 0001 0000
最后这个数字再和1按位或运算
0000 0000 0000 0101 1100 0000 0001 0000
0000 0000 0000 0000 0000 0000 0000 0001
结果是0000 0000 0000 0101 1100 0000 0001 0001
对应十进制数是376849
看rmpllcon的值之前,先看函数changempllvalue的计算过程,三个参数如下:
(mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3
mpll_val的值是
0000 0000 0000 0101 1100 0000 0001 0001
mpll_val>>12是右移12位,得到结果是
0000 0000 0000 0000 0000 0000 0101 1100
(mpll_val>>12)&0xff,“&”是按位与运算符
0000 0000 0000 0000 0000 0000 0101 1100
0000 0000 0000 0000 0000 0000 1111 1111
以上两个数按位与的结果是
0000 0000 0000 0000 0000 0000 0101 1100
(mpll_val>>4)&0x3f,mpll_val右移4位,与0x3f按位与,结果是
0000 0000 0000 0000 0000 0000 0000 0001
mpll_val&3的结果是
0000 0000 0000 0000 0000 0000 0000 0001
所以三个参数是
0000 0000 0000 0000 0000 0000 0101 1100
0000 0000 0000 0000 0000 0000 0000 0001
0000 0000 0000 0000 0000 0000 0000 0001
对应十进制分别为:92,1,1
所以 (mdiv<<12) | (pdiv<<4) | sdiv带入参数后,实际还是(92<<12)|(1<<4)|(1)
计算结果也是376849
#define rmpllcon (*(volatile unsigned *)0x4c000004)
根据这个定义rmpllcon是一个符号,代表 (*(volatile unsigned *)0x4c000004),编译器会用 (*(volatile unsigned *)0x4c000004)代替rmpllcon,所以rmpllcon不是一个变量,也就没有值。
rmpllcon = (mdiv<<12) | (pdiv<<4) | sdiv;这句的结果是会把等号右边的计算结果赋值给(*(volatile unsigned *)0x4c000004),这里定义的是一个常量指针,这个指针指向的地址做什么的我不清楚,我这里测试运行了一下,系统出错,提示不允许对这个地址操作。
changempllvalue()这个函数定义没有返回值,所以changempllvalue是空值。
C语言数组问题,C语言新手 数组问题
1楼 千锋教育 你的 问题有以下几个 1 min和max没有初始化 2 对于a min 和a max 没有做循环参考 如下 include main printf 最大数是 d,下标是 d,最小数是 d,下标是 d n a max max a min min 2楼 天雨下凡 include void...
c语言中三维数组的赋值问题,C语言中三维数组的赋值问题
1楼 匿名用户 int limit 4 5 2 你这样定义是 int limit 20 2 。int limit 4 5 2 应该是 int limit 4 5 2 c语言 三维数组赋值给二维数组,为什么可以这样?里面的数值不会改变了吗? 2楼 你的数组a其实仍然是二维数组,因为你给的值显然是一个二...
c语言转义字符问题,Android转义字符 5
1楼 育知同创教育 t是tab自动补空格 012是八进制的, x55是16进制, a没有定义 android转义字符 5 2楼 匿名用户 这个你可以用替换的方式,直接将em替换成某个自己识别的,最后再替换回来即可。 3楼 匿名用户 以下为xml标志符的数字和字符串转义符 或 或 或 lt 或 gt ...