c/c++整理--位运算与嵌入式编程(1)

来源:互联网 发布:身份证恶搞软件 编辑:程序博客网 时间:2024/06/07 20:48

一、位制转换

#include <stdio.h>int main(){int i = 5.01;float f = 5;printf("%f\n", 5);printf("%lf\n", 5.01);printf("%f\n", f);printf("%d\n", 5.01);printf("%d\n", i);return 0;}
32位平台中,int和float都占4个字节,double占8个字节。printf根据%f会默认为double类型参数(printf函数中float会自动转换成double),因此从栈中读了8个字节,类似的,%d时,读取int型参数,从栈中读取4个字节。

第8行中,首先参数为int型,占四个字节,但是printf从栈中读取8个字节,内存越界,会出现段错误。

第9、10行中,参数为double和float类型,f在赋值时已经做了一次int到float类型,而float和double都是浮点型,其相互转化是安全的。

第12行,参数是5.01,占8个字节,printf读取4个字节,会出现不可意料的状况。

第13行,i已经在赋值的时候转换为int型了,所以%d读取4个字节是安全的。

输出:

0.0000005.0100005.00000018897856105


二、看代码写结果——位运算

#include <stdio.h>int main(){unsigned short int i = 0;unsigned char ii = 255;int j = 8, p, q;p = j << 1;q = j >> 1;i = i - 1;ii = ii + 1;printf("i = %d\n", i);printf("ii = %d\n", ii);printf("p = %d\n", p);printf("q = %d\n", q);return 0;}
首先,p = j << 1;这里j为8,即1000,左移一位为10000,即p为16。q = j >> 1,j右移一位为0100,即q为4;

i = i-1;i为无符号短整型数,0之后的一位即为2个字节所能表示的最大数,即65535;

ii = ii + 1;ii为无符号字符型,255达到了一个字节所能表示的最大数,所以加一之后即为0;

输出:

i = 65535ii = 0p = 16q = 4

三、设置或者清除特定的位

嵌入式系统总是要求用户对变量或寄存器进行位操作,给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a的bit 3.在以上操作中,要保持其他位不变。
#define BIT3   (0x1 << 3)static int a;void set_bit3(){a |= BIT3;}void clear_bit3(){a &= ~BIT3;}

在这里,BIT3用来计算需要操作的位,|=和&=分别用于指定位置1和位置0.






0 0
原创粉丝点击