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
- c/c++整理--位运算与嵌入式编程(1)
- c/c++整理--位运算与嵌入式编程(2)
- c/c++整理--位运算与嵌入式编程(3)
- 位运算与嵌入式编程
- C#、SQL位运算整理
- C语言位运算整理
- C语言位运算的高级应用(尤其适合单片机和嵌入式编程)
- 第十二章 位运算与嵌入式编程
- 位运算(C/C++)
- 【资料整理】C语言位运算总结
- 【资料整理】C语言位运算总结
- 【资料整理】C语言位运算总结
- 嵌入式C语言位运算之清位置位
- 位运算与嵌入式编程之位制转换之一
- C/C++语法知识精华整理(1)-左值与右值、变量与常量、 define与const、Printf特点、补码与阶码、位运算等
- C语言嵌入式系统编程修炼[整理]
- 单片机与嵌入式系统中C语言的位运算小记
- Objective-C位运算符-按位与运算符
- 不要在linux上启用net.ipv4.tcp_tw_recycle参数
- 机器学习--knn手写数字识别系统
- 硬科技改变世界
- js设置cookie
- 微分方程的数值解法——常微分方程——欧拉法与改进欧拉法(2)
- c/c++整理--位运算与嵌入式编程(1)
- 递推——Codeforces 319A
- C语言中有符号数与无符号数相加
- 互联网注定被抛弃,未来30年属于硬科技!深层逻辑是这样的
- eclipse svn中打开xml文件出现Android xml editor cannot process this input 问题
- OpenCV 3.1.0支持向量机SVM
- OpenGL光照计算原理
- Mysql 约束
- Python3.6 IDLE常用快捷键