定义一个整型变量
signed int a = 10 定义一个有符号正整数 (signed一般可以省略)
unsigned int a = 10 定义一个无符号整数 (这个时候10前面不能加符号)
int a = 0123 定义八进制数据 以0开头
int a = 0x123 定义十六进制数据 以0x开头
在计算机定义数据时,不可以直接定义二进制
整形变量输出使用的占位符
%d 有符号的十进制int类型 占位符
%hd 短整型short 占位符
%ld 长整型 long 占位符
%lld 长长整型 long long 占位符
%o(字母) 输出八进制的int类型
%x 十六进制的int类型占位符,字母以小写输出
%X 十六进制的int类型占位符,字母以大写输出
%u 十进制的无符号数占位符
%hu 无符号短整型占位符
%lu 无符号长整型占位符
%llu 无符号长长整型占位符
整型输入和输出
需求:键盘输入一个整型数字,存放到一个整型变量中,再将该整型变量打印出来
#include<stdio.h>
int main(){
int a;
scanf("%d",&a);
printf("%d\n",a);
}
解析:
int a; 定义一个整形变量a
scanf("%d",&a); scanf函数表示通过键盘输入赋值,
%d是占位符,表示输入的数据将会是一个整形数据
&a &表示取地址 &a表示取出a变量对应的内存地址
整行代码表示将键盘输入的数据存放在变量对应的内存地址中
printf("%d\n",a); 打印常用句式
注意:整形数据在内存中存放格式为两部分,一部分是符号部分,一部分是数值部分
使用scanf函数,可能会有编译报错4996,这相当于是一个不确定性的异常,因为无法确定用户从键盘输入了什么东西,有可能是个汉字
解决办法:在代码第一行加上
#define _CRT_SECURE_NO_WARNINGA
或者加一个宏定义
#pragma warning(disable:4996)
整型大小
short 短整型 2字节
int 整形 4字节
long 长整型 windows为4字节,Linux为4字节(32位) 8字节(64位)
long long 长长整型 8字节
注意:
- 整形数据在内存中占用的字节数与选择的操作系统有关,虽然C语言没有明确规定整形数据的长度,但long类型整数的长度不能短于int类型,short类型整数的长度不能长于int类型
- 当一个小的数据类型赋值给大的数据类型,不会出错,因为编译器会自动转化,但当一个大的类型赋值给一个小的数据类型,有可能会丢失高位。
- sizeof 计算数据类型在内存中占用的字节(BYTE)大小,他不是一个函数,不需要导入任何头文件,
用法:sizeof(数据类型)
sizeof(变量名)
sizeof 变量名
字符型
定义:
char ch = 'a';
字符型也叫char类型,定义时,需要用单引号把字符括起来
打印 %c 占位符
大小 1个字节
char变量实际上并不是把该字符本身放到内存单元中去,而是将该字符对应的ASCII编码放到变量的存储单元中,char的本质就是一个字节大小的整型
ASCII表几个特殊需要记住的:‘0’ = 48 ‘A’ = 65 ‘a’ = 97
实型(浮点型)
-
float
定义:
float a = 3.14f;
大小:4字节
-
double
定义:double b = 3.14 (后边啥也不跟,默认double类型)
大小:8字节
注意:浮点型数据,存储在内存中的格式分为符号位,指数位,小数位
上面的两种定义方式是传统方式的赋值,还有一种方式是科学法赋值
float c = 3.2e3f;//3.2*10的三次方 也就是3.2*1000
float d = 100e-3f;//100*10的-3次方 100*0.001 = 0.1
%e 占位符 以科学计数法打印当前小数
float a = 3210.456;
printf("%e",a); //3.210456e03
字符串常量
字符串是内存中一段连续的char空间,以’\0’(数字0)结尾
字符串常量是由双引号括起来的字符序列,如“china”
字符串常量与字符常量的不同 :
'a' 为字符常量 在内存中存储为 ‘a’
“a” 为字符串常量 在内存中存储为 'a' '\0'
每个字符串的结尾,编译器会自动的添加一个结束标志位’\0’,即"a"包含两个字符’a’和’\0’
举例:
char * b = "hello world!";
printf("%s\n",b); 输出 hello world!
char * b = "hello\0 world!";
printf("%s\0",b); 输出 hello
%s 是占位符,表示输出一个字符串,遇到\0停止输出
扩展:
char b[11] = "hello world";
字符串加上\0总共长度是12,但是定义b的时候长度只有11,这样字符串最后面的\0就会被舍弃,这种情况打印b 会出现hello world之后全是乱码,每次都不一样
字符的输入与输出
- printf()输出一个字符串
- putchar()输出一个char,参数可以是变量,字符,数字(ASCII范围内)转义字符
- getchar() 接收一个char,输入很多字符的话,只接收最后一个
格式化输入与输出
int a = 10;
printf("===%d===\n",a); ========> ===10=== 正常输出
printf("===%5d===\n",a); ========> === 10=== %5d 表示该十进制数最小宽度为5,并且默认右对齐
printf("===%-5d===\n",a); ========> ===10 === %-5d 表示该十进制数最小宽度为5,并且左对齐
printf("===%05d===\n",a); ========> ===00010=== %05d 表示该十进制数最小宽度为5,并且前面补零
int a = 123456;
printf("===%5d===\n",a); ========> ===123456=== 假如该数有6位,但是最小宽度为5,输出按数字来,而不是按占位符来
float b = 3.14f;
printf("===%f===\n",b); ========> ===3.14=== 正常输出
printf("===%7.2f===",b); ========> === 3.14=== 7表示整个浮点数的最小宽度,.2表示小数点后保留两位
printf("===%-7.2f===",b); ========> ===3.14 === 左对齐
printf("===%07.2f===",b); ========> ===0003.14=== 位数不够,前面补零
类型转换
有两种方式:
-
自动转换(隐式转换):遵循一定的规则,由编译系统自动完成。
double d = 3.14f;
-
强制类型转换:把表达式的运算结果强制转换成所需要的数据类型,不会四舍五入
类型转换的原则:占用内存字节数少的类型,向占用内存字节数多的类型转换,以保证精度不降低:
char,short -> signed int -> unsigned int -> long -> double <- float