一.
在内存中存储定点数时,一般以其最高位(最左边一位)表示数的符号,0表示正,1表示负。数值是以补码形式存放的。一个正数的补码就是该数的二进制数。一个负数的补码我们通过下面的方法求得:
(1)先取该数的绝对值
(2)然后以二进制数的形式存放
(3)再对其取反
(4)然后加1
所有负数的二进制补码的最高位必然为1.
显然,无符号的正数的最大值约为有符号的正数的最大值的两倍再加1(因为补码有正0和负0)。在C语言中,实数(浮点型)都是有符号的,不可以使用无符号修饰符。
二.
常用数据类型的长度:(1B = 8bit)
char:1B
short:2B
int:4B
long:4B
float:4B
double:8B
long long:8B
三.
字符类型的数据在内存中是以相对应的ASCII码存放。
四.
打印人民币符号printf("Y\b=\n");控制代码"\b"使打印头退回一格,回来打印好的Y位置再打印字符“=”,两个字符重叠形成人民币符号。当然,这一输出只能在打印机上实现,而不能在显示器上实现。因为显示器没有重叠显示功能。
五.
对一格变量进行显示转换后,得到另外一格类型的数据,但原变量的类型不变。
六.
Printf()函数一般形式如下:
int printf(格式控制字符串,输出表达式1,输出表达式2,...);
格式控制字符串由两部分组成:格式说明字段和普通字符。普通字符(包括转义符序列)将被简单的复制并显示。一个格式说明字段将引起一个输出参数项的转换与显示,它是由"%"引出的格式说明字段。格式说明字段与后面的输出表达式参数要对应一致。
% 前缀修饰 域宽 精度 长度修正符 格式码
-,0,+,空格,# 十进制整数 十进制整数
需要指出的是:输出数据的实际精度并不主要取决于格式说明字段中的域宽和精度,也不取决于输入数据的精度,而主要取决于数据在机器内的存储精度。例如,一般C语言系统对float数据只能提供6为有效数字。格式说明字段中所指定的域宽再大,精度再长,得到的多余位数上的数字是毫无意义的。所以,增加域宽与精度并不能提高输出数据的实际精度。
七.
当年困扰自己的一个问题
#include<stdio.h>
int mian(void)
{
Int a = 1, b = 2;
Printf("x = %d, y = %d\n", ++a + b, ++b + a);
Return 0;
}
程序执行结果为x = 5, y = 4
原因在于printf()函数中输出表达式的运算顺序是由右向左的。但是应注意此规则会因编译程序的不同而不同。所以,我们尽量确保在输出时,输出表达式不能相互影响,要确实是一个固定的值。
八.
在输入数据时,实际上并非输入一个数据项就送给一个变量,而是在输入一行字符并按enter键之后才被输入,这一行字符先存放在一个缓冲区内,然后按照scanf()格式说明的要求从缓冲区中读取数据,如果输入数据多于一个scanf()锁要求的个数,那么余下的数据将作为下一个scanf()接着使用。为了保持输入的一致性,可以在格式串中的不同类型转变处添加显式的空白。scanf("%d %c %c %d %lf", &num, &name, &sex, &age, &salary);
当定义中有字段宽度时,scanf()将在缓冲区中的输入流上,按照宽度有间隔的挑取字符。
scanf("%3c%3c", &c, &d); 如果我们输入为abcd,那么c=a, d=d;
九.
在执行getchar()时,虽然是每次读入一个字符,就回显一个字符,但并非从键盘输入一个字符,该字符就立即送给一个字符变量,而是等到按Enter后,才将一行字符输入缓冲区,然后getchar()函数从缓冲区中取一个字符送给一个字符型变量。这种情况成为行缓冲。