C基础复习
1.数据类型:
有符号数是最高位为符号位,0代表正数,1代表负数。
无符号数最高位不是符号位,而就是数的一部分,无符号数不可能是负数。
当我们写程序要处理一个不可能出现负值的时候,一般用无符号数,这样可以增大数的表达最大值。
有符号:signed
无符号:unsigned
默认情况下,定义变量时省略使用signed,定义无符号的数时要用到unsigned
无符号数输出的占位符:%u\U
整型:
类型: 范围
short ,(-2^15 ~ 2^15-1)
int ,(-2^31 ~ 2^31-1)
long ,(-2^31 ~ 2^31-1)
long long,(-2^63 ~ 2^63-1)
大小:2 4 4 8
注:对于long:Windows为4字节,Linux为4字节(32位),8字节(64位)
sizeof不是函数,所以不需要包含任何头文件,它的功能是计算一个数据类型的大小,单位为字节
sizeof的返回值为size_t
size_t类型在32位操作系统下是unsigned int,是一个无符号的整数
占位符:%hd %d %ld %lld
2.字符型:
char ch='a';ASCII码上的东西
大小写差了32
字符变量实际上并不是把该字符本身放到变量的内存单元中去,
而是将该字符对应的 ASCII 编码放到变量的存储单元中。
char的本质就是一个1字节大小的整型。
占位符:%c
大小:1字节
3.浮点型:
浮点型变量是用来存储小数数值的。在C语言中, 浮点型变量分为两种:
单精度浮点数(float)、 双精度浮点数(double), 大小分别为4 8字节
但是double型变量所表示的浮点数比 float 型变量更精确。
不以f结尾的常量是double类型,以f结尾的常量(如3.14f)是float类型。
科学法赋值
a = 3.2e3f; //3.2*1000 = 3200,e可以写E
printf("a1 = %f\n", a);
a = 100e-3f; //100*0.001 = 0.1
printf("a2 = %f\n", a);
占位符:%f %lf
4.进制:
十进制,二进制,八进制,十六进制
输出的占位符:%d 无 %o %x
定义八进制是以0开头的 0-7
定义十六进制是以0x开头 0-9 a-f
5.计算机中数的存储:
在计算机系统中,数值一律用补码来存储。
补码特点:
对于正数,原码、反码、补码相同
对于负数,其补码为它的反码加1
补码符号位不动,其他位求反,最后整个数加1,得到原码
6. 数值溢出
当超过一个数据类型能够存放最大的范围时,数值会溢出。
有符号位最高位溢出的区别:符号位溢出会导致数的正负发生改变,
但最高位的溢出会导致最高位丢失。
7.类型限定
extern
声明一个变量,extern声明的变量没有建立存储空间。
extern int a;//变量在定义的时候创建存储空间
const
定义一个常量,常量的值不能修改。
const int a = 10;
Volatile
防止编译器优化代码
register
定义寄存器变量,提高效率。
register是建议型的指令,而不是命令型的指令,
如果CPU有空闲寄存器,那么register就生效,
如果没有空闲寄存器,那么register无效。
8.字符串常量
符串是内存中一段连续的char空间,默认以'\0'(数字0)结尾。
字符串常量是由双引号括起来的字符序列,如“china”、“C program”,“$12.5”等都是合法的字符串常量。
printf是输出一个字符串,putchar输出一个char。
占位符为%s:表示输出一个字符串,遇到\0停止,如果在一个字符数组中没有\0则会溢出 出现烫烫烫~
getchar是从标准输入设备读取一个char。
scanf通过%转义的方式可以得到用户通过标准输入设备输入的数据。
scanf("%d%d",&s,&b);
是以空格或者换行符分割
scanf()把输入的字符串转换成整数、浮点数、字符或字符串,而
printf()正好与它相反,把整数、浮点数、字符和字符串转换成显示在屏幕上
的文本。
scanf()读取基本变量类型的值,在变量名前加上一个&;
如果用scanf()把字符串读入字符数组中,不要使用&。
void test3() {
double d = 12.3;
printf("d = \' %lf \'\n", d);
int a ,b = 0;
scanf("%d,%d", &a, &b);
printf("a=%d,b=%d", a, b);
}
void test1() {
unsigned int a = 10;
printf("无符号:%u\n", a);
int b = 10;
printf("十进制:%d\n", a);
short c = 10;
long d = 10;
long long e = 10;
float f = 0.1f;
double g = 0.1;
printf("short:%d\n", sizeof(c));
printf("long:%d\n", sizeof(d));
printf("long long:%d\n", sizeof(e));
printf("float: %d\n", sizeof(f));
printf("double: %d\n", sizeof(g));
printf("八进制:%o\n", a);
printf("十六进制:%x\n", a);
printf("请输入一个整数:");
scanf("%d", &a);
printf("%d", a);
}
void test2() {
char ch = 'a';
printf("sizeof(ch) = %u\n", sizeof(ch));
printf("ch[%%c] = %c\n", ch); //打印字符
printf("ch[%%d] = %d\n", ch); //打印‘a’ ASCII的值
char A = 'A';
char a = 'a';
printf("a = %d\n", a); //97
printf("A = %d\n", A); //65
printf("A = %c\n", 'a' - 32); //小写a转大写A
printf("a = %c\n", 'A' + 32); //大写A转小写a
ch = ' ';
printf("空字符:%d\n", ch); //空字符ASCII的值为32
printf("A = %c\n", 'a' - ' '); //小写a转大写A
printf("a = %c\n", 'A' + ' '); //大写A转小写a
}
int main(void)
{
test3();
}