keil中c语言问题汇总(佛科院——深夜学习)

目录

一、不理解该函数

1.TH0,TL0的解释:

2.分析:

3.总结:

二、如何理解左移右移操作:

三、如何关闭未调用函数警告:

三、sprintf函数的使用:

1、作用:

1、调用库:

2、函数参数解释:

3、格式化符号:

4、基本功能:

1、格式化数字:

5、注意:


一、不理解该函数

1.TH0,TL0的解释:

在16位定时器模式下,TH0相当于计数器0的高8位,TL0相当于定时器0的低8位。

2.分析:

假设TH0=200,TL0=100,用二进制表示应该是TH0=1100 1000,TL0=0110 0100.

TH0<<8:将TH0右移8位 (TH0<<8)=1100 1000 0000 0000

(TH0<<8)| TL0:将(TH0<<8)与 TL0进行与运算,也就是只要一方某一位为1,最后结果该位也为1,(TH0<<8)| TL0=1100 1000 0110 0100

3.总结:

这是最常见的处理16位数据的方法,应为一般一个字节只有8位,如果一个数据是16位,最好是把它分为高8位和低8位

二、如何理解左移右移操作:

1、移位操作会导致位溢出和位补偿0

2、具体溢出看具体定义的类型,unsign char 为8位,unsign int 为16位,unsigned long 为32位

3、左移右移操作还可以用在串行通信上:

//高位先行,也就是先发高位
void Write_byte(u8 w_data)
{
	u8 i;
	for(i=0;i<8;i++)
	{
		SDA=w_data>>7;//将低七位都溢出,留下最高位发送
		w_data<<=1;//将次高位变成最高位
		/*后面是发送的步骤*/
		SCL=1;
		delay_us(5);
		SCL=0;
		delay_us(5);
	}
}

三、如何关闭未调用函数警告:

找到Disable Warning Number输入相应警告的编号,就能关闭该警告

 就例如这个警告的编号是16

三、sprintf函数的使用:

1、作用:

将不同的格式数据全部统一成字符串,而且可以指定字符串的格式

1、调用库:

#include "stdio.h"

2、函数参数解释:

int sprintf( char *buffer, const char *format [, argument] … );

  • buffer:指向字符数组的指针,格式化后的字符串会存储在这里。
  • format:格式化的字符串,可以指定字符串的格式
  • argument:根据语法格式替换format中%标签

3、格式化符号:

  1. %o 无符号8进制整数
  2. %u 无符号10进制整数
  3. %x 无符号的16进制数字,并以小写abcdef表示
  4. %X 无符号的16进制数字,并以大写ABCDEF表示

4、基本功能:

1、格式化数字:

(1)基本操作:

sprintf(s, "%d", 123); // 产生"123"

(2)指定宽度:

	
sprintf(s, "%8d%8d", 123, 4567); // 产生:"    123    4567"

(3)左对齐:

sprintf(s, "%-8d%8d", 123, 4567); // 产生:"123 

(4)16进制打印:

sprintf(s, "%8x", 4567); // 小写16进制,宽度占8个位置,右对齐

sprintf(s, "%-8X", 4568); // 大写16进制,宽度占8个位置,左对齐

(5)左边补0的16进制字符串:


sprintf(s, "%08X", 4567); // 产生:"000011D7"

5、注意:

(1) spritnf 是个变参函数,除了前两个参数不会变之外,后面的参数都会都会因为格式符而发生变化,例如:

unsigned char ucSec;
sprintf(pucSeg_Buf, "    %04u", (unsigned int)ucSec);

由于unsigned char 是八位的数据,而%u是无符号整形(unsigned int)是十六位的数据,在传递过程中就会出错,所以我们在传入数据前最好先统一格式

四、\r,\n,\r\n的理解

1、\r代表回车,即回到当前行的行首,继续输入就会覆盖掉之前输入的信息

2、\n代表换行,即换到当前位置的下一行

3、\r\n则是代表先回车再换行,即换到下一行的行首

五、指针在使用前要指向一个地址

sprintf函数的使用-编程语言-CSDN问答