目录
一、学习目标:
二、数据基本类型
整型
浮点型 / 实型
字符
字符串
布尔型数据
三、重要的杂七杂八知识点
常量与变量
标准输入
sizeof运算符:
类型转换
数据类型的本质
整型数据尺寸
可移植性整型
拿下第一个C语言程序
总结
知识点:
int a = 123;
// 定义了一个专门用来存储整数的变量a
- int 的本意是 integer,即整数的意思
- int a 代表在内存中开辟一块小区域,称为 a,用来存放整数,a 一般被称为变量。
- 变量 a 所占内存大小,在不同的系统中是不一样的,64位 32 位 系统典型的大小是4个字节
- 变量 a 有固定的大小,因此也有取值范围,典型的范围是:-2147483648到2147483647
- 整型修饰符
- short:用来缩短整型变量的尺寸,减少取值范围并节省内存,称为短整型
- long:用来增长整型变量的尺寸,增大取值范围并占用更多内存,称为长整型
- long long:用来增长整型变量的尺寸,增大取值范围并占用更多内存,称为长长整型
- unsigned:用来去除整型变量的符号位,使得整型变量只能表达非负整数
short int a; // 短整型
long int b; // 长整型
long long int c; // 长长整型
unsigned int e; // 无符号整型
unsigned short int f; // 无符号短整型
unsigned long int g; // 无符号长整型
unsigned long long int h; // 无符号长长整型
short a; // 短整型
long b; // 长整型
long long c; // 长长整型
unsigned e; // 无符号整型
unsigned short f; // 无符号短整型
unsigned long g; // 无符号长整型
unsigned long long h; // 无符号长长整型
- 符号位:
- 有符号的整型数据,首位(最高位)为符号位,0表示正数,1表示负数。
- 无符号的整形数据,没有符号位。
- 编码形式:
- 原码:正数直接使用二进制来表达,比如a=100,在内存中是 00…001100100
- 补码:负数用绝对值取反加一来表达,比如a=-3,在内存中是11…1111111101
- 补码 = 该负数的绝对值的源码 --> 取反 --> + 1
// 以下3个变量看起来都是 100 但实际由于进制不同则他们表示的数值有有差异:
int a1 = 100 ; int a2 = 0100; int a3 = 0x100 ;
格式控制符
十进制输出: int 整型:%d short 整型:%hd, h代表half,即一半的存储字节 long 整型:%ld long long 整型:%lld 八进制输出: 显示不同进制的前缀: %#o 十六进制输出: %#x
示例:
// 以下3个变量看起来都是 100 但实际由于进制不同则他们表示的数值有有差异
int a1 = 100 ;
int a2 = 0100;
int a3 = 0x1AB ;
printf("a1:%d a2:%d a3:%d\n" , a1 , a2 , a3); // %d 十进制输出整形
printf("a1:%#x a2:%#x a3:%#X\n" , a1 , a2 , a3); // %x 十六进制输出整形 # 则可以输出十六进制的前缀0x
// x 可以是大写也可以是小写,对应的是十六进制中字符的大小写
// %#x -> 0xab
// %#X -> 0XAB
short s ;
int i ;
long l ;
long long ll ;
printf( "s:%d\n" , s );
printf( "i:%d\n" , i );
printf( "l:%ld\n" , l );
printf( "ll:%lld\n" , ll );
float f1; // 单精度
double f2; // 双精度
long double f3; // 长双精度
1234.5678 -> 1.2345678*10^3
0.0001234567 -> 1.234567*10^-4
实际上他就是一个单字节的整形,也可以与整形一样参与运算。
char ch1 = 'a'; // 'a'是字符常量,代表字母a的ascii值 97 char ch2 = '\n'; // '\n'是不可见字符常量,代表回车
计算机中存储的都是1和0,因此各种字符都必须被映射为某个数字才能存储到计算机中,这种映射关系形成的表称为 ASCII 码表。
字符本质上就是一个单字节的整型,支持整型所有的运算。
比如:
char c1 = 20;
char c2 = c1 + 'a'; // 等价于 char c2 = 20 + 97;
printf("%c\n", c2); // 以字符形式输出117,即 'u'
printf("%d\n", c2); // 以整型形式输出117
// 字符串的定义方式有两种:指针和数组
char *s1 = "abcd"; // 使用字符指针来指向一个字符串
char s2[]= "abcd"; // 使用字符数组来存储字符串
// 注意,使用数组来定义字符串时,方括号[]里面的数字可以省略
// 不省略也可以,但必须必字符串实际占用的内存字节数要大,比如:
char s3[] = "apple";
bool a = 1; // 逻辑真,此处1可以取其他任何非零数值
bool b = 0; // 逻辑假
举例:
int a = 100; // a是变量,而100是常量 float f = 3.14; // f是变量,而3.14是常量 char s[] = "abcd"; // s是变量,"abcd"是常量
常量举例 |
说明 |
类型 |
100 |
整型 |
int |
100L |
长整型 |
long |
100LL |
长长整型 |
long long |
100ULL |
无符号长长整型 |
unsigned long long |
3.14 |
双精度浮点型 |
double |
3.14L |
长双精度浮点型 |
long double |
‘a’ |
字符型 |
char |
“abcd” |
字符指针(字符串) |
char * |
scanf(); // 格式化输入函数
fgets(); // 字符串输入函数
int a;
float f;
scanf("%d", &a); // 从键盘输入一个整型,放入指定的内存地址 &a 中
scanf("%f", &f); // 从键盘输入一个浮点数,放入指定的内存地址 &f 中
scanf("%d%f", &a, &f); // 从键盘依次输入一个整型和一个浮点型数据,用空白符隔开
char c;
char s[10];
scanf("%c", &c); // 从键盘输入一个字符,放入指定的内存地址 &f 中
scanf("%s", s ); // 从键盘输入一个单词,放入指定的数组 s 中(注意不是&s)
fgets(s, 10, stdin); // 从键盘输入一行字符串,放入数组 s 中
// 此处输入时必须带逗号
scanf("%d,%d", &a, &b);
// 此处必须先输入a=,然后才能输入整数
scanf("a=%d", &a);
// 此处结束输入时按下的回车符将被scanf()误以为格式控制符,无法正常结束输入
scanf("%d\n", &a);
实例:
#include
int main(int argc, char const *argv[])
{
int i = 0;
char ch = 0;
float f = 0;
char buf [32] = {0};
// 如下所示,如果在输入多项数据的时候, 从左往右第一项不匹配后会导致往后的所有项目输入终止
int ret_val = scanf( "a=%d ch=%c f=%f buf=%s" , &i , &ch , &f , buf );
// 如果输入表达式如上所示使用空格进行分割各种类型的控制符,那么在输入的时候可以匹配空格 、 Tab 、 回车
// 如果 scanf( "%d,%s,%c" , ...); 这么写在输入时就必须使用 ,(逗号) 进行分割
// 注意千万不要手贱在 格式控制符中加上 \n 不然会出现迷惑现象,必须多输入一个无用的数据+\n才能解脱
printf("成功输入:%d项数据..\n" , ret_val);
printf("i:%d ch:%d f:%f buf:%s\n" , i , ch , f , buf );
return 0;
}
总结:
拓展:
int a = 123 ;
printf("%ld\n" , sizeof a );// 当使用sizeof 求某一个变量的大小时可以省略括号
printf("%ld\n" , sizeof (a) );
printf("%ld\n" , sizeof(int) );
printf("short: %ld\n" , sizeof(short) ); // 2
printf("int :%ld\n" , sizeof(int) ); // 4
printf("long : %ld\n" , sizeof(long) ); // 4(32位系统) / 8(64位系统)
printf("long long :%ld\n" , sizeof(long long ) ); // 8 (32 \ 64 位系统)
隐式转换示例代码
char a = 'a'; int b = 12; float c = 3.14; float x = a + b - c;
// 在该表达式中将发生隐式转换,所有操作数被提升为float
char a = 'a'; int b = 12; float c = 3.14; float x = a + b - (int)c;
// 在该表达式中a隐式自动转换为int,c被强制转为int
不管是隐式转换,还是强制转换,变换的都是操作数在运算过程中的类型,是临时的,操作数本身的类型不会改变,也无法改变。
17620828909 电话
17620828909 余额
int a = 123 ;
float 123
typedef int int32_t; // 将类型 int 取个别名,称为 int32_t
typedef long int64_t;// 将类型 long 取个别名,称为 int64_t
#include
int main(int argc, char const *argv[])
{
long l = 345 ; // 不具备可移植的属性,因在不不同的系统中他的大小有可能发生变化
__int64_t k = 567 ; // 可移植数据类型,在不同的系统中他的大小都是固定的
printf("long:%ld\n" , sizeof(long));
printf("long long :%ld\n" , sizeof(long long));
printf("__int64_t:%ld\n" , sizeof(__int64_t));
return 0;
}
本文介绍了C的一些基本类型知识和类型转换要点,还有变量、常量等其他知识。理解本文所有知识点后,便可编译一个属于自己的小程序,算上是窥得C语皮毛矣
本文参照 粤嵌文哥 部分课件经整理和修改后发布在C站,如有转载,请联系本人