qwq现在被迫重新捡起大一的c语言。
1.数据类型关键字
1.1按存储类型分类
按计算机的存储类型可以分为两大类:整数类型和浮点类型。二者的存储方式不同
例如7,在8位字节中存储该数组00000111;
浮点数是分开存储小数和指数,例如7.0,在十进制下就是0.7E1,1是指数部分;计算机存储3.14159,首先是符号位+,接着是小数.314159,指数部分是1,10^1
1.2 按数据类型分类
基本的数据类型关键字:int,long,short,unsigned,char,float,double,signed,_Bool,_Complex,_Imaginary
int类型与其输入输出
修饰基本整数类型的关键字:short,long,unsigned,short和long都代表有符号。unsigned用于非负值场合,即unsigned
int 表示0~65535。
打印整数
h和l前缀都可以和u一起使用%lu,%lld,%llu
基本输入 | 修饰 |
---|---|
%d | %ld %hd |
%x | %lx %hx |
%o | %lo %ho |
char类型,bool类型与其输入输出
char也是一种整数类型,因为存储的是整数(ASCII码)例如字母A其实是整数65,char占一个字节。
用%c指明待打印的字符
float,double,long double与其输入输出
浮点数在计算机的计数方式一般是e计数法,123000->1.23*10^5->1.23e5.
float可以精确到小数点后6位,浮点数占32位,即4个字节,第一个8位表示指数的值和符号,后24位表示非指数部分,双精度double多出来的32位全部给指数部分。
默认情况下编译器假定浮点型常量是double类型,可以通过后缀2.3f,和2.3L来改变类型。
打印浮点数
%f 十进制计数法
%e 指数计数法
修饰 %lf %le
2.字符串
字符串都被存储在char类型的数组中,数组由连续的存储单元组成,尾部是一个空字符,在输入输出中以%s来表示。
3.格式化输入输出
3.1标记
- 左对齐 %-20s
- 显示正负号 %+6.2f
- 格式转换%#o,%#8.0f
- 0 表示用0填充字段
3.2修饰符
- 数字与.数字
前面的数字表示宽度,后面的数字表示小数点的位数%5.2f - %hu %hx %6.4hd 表示short int 或unsigned short int
- %hhu %hhx %6.4hhd 表示signed char 或unsigned char
- l与ll
- L
- %td表示指针差 %z表示size_t类型,sizeof的返回值
- *在printf和scanf里的不同用法
如果是printf(“The number is:%*d”, width, number)代表宽度
如果是scanf(“%*d%*d%d”,&n)代表跳过
3.3数据的上溢和下溢
整数
对于unsigned整型溢出,溢出后的数会以2^(8*sizeof(type))做模运算
对于signed整型溢出,分为向上溢出和向下溢出。
例如 signed char 正整数最大值127,负整数最小值128.
int main(void)
{
signed char x;
x = 125+5;
printf("%d\n",x);
}
输出为-126
130的二进制位10000010,符号位为1,用补码表示负数,绝对值取反+1,倒推回去就是10000010-1 = 10000001,再取反01111110,即-126
signed char x;
x = 200+250;
printf("%d\n",x);
输出为-62,因为450超过了255,取结果的低八位,再进行补码的反向操作(减1取反)
浮点数
上溢:当赋值的浮点数超过定义类型的范围时,就会出现上溢。
一般输出INF
下溢:在一些除法运算中,由于数值太小,低于当前类型所能表示的最小的值,计算机就只好把尾数位向右移,空出第一个二进制位,但是与此同时,却损失了原来末尾有效位上面的数字,这种情况就叫做下溢。以一个十进制为例,把一个有4位有效数字的数(如,0.1234E-10)除以10,得到的结果为:0.0123E-10.虽然得到了结果,但是在计算过程中丢失了原末尾有效位尚的数字,这种情况叫做下溢。