数字 十进制数(Dec) 20
八进制(Oct) 024
十六进制(Hex) 0x14
二进制数(Bin) 0b10100
字符‘ ‘ man ascii
‘a’ 字符a的ascii码是97
‘A’ 字符A的ascii码是65
‘0’ 字符0的ascii码是48
转义字符在字符中用\表示
‘\n’ 换行符 Linux中一次enter键会识别为‘\n’
还有 ‘\t’ 制表符 [tab]
‘\r’ 回车符, window中一[enter]键会识别为’\r’’\n’
‘\b’ 退格符 [backspace]
'\0' 空字符 (nullcharacter) 就是0
‘\\’ 因为\已经表示转义字符,所以要表示一个\必须写成’\\’
还有和八进制或者十六进制数字联合一起的转义字符,表示取对应的ASCII码值
Oct Dec Hex Char
141 97 61 a
‘a’ === 97 ===0141 ===0x61===’\x61’ ===’\141’
练习:
定义一个char类型变量,尝试用不同的方式给该变量赋值,并打印结果;
char x = ‘a’;
char y = 97;
printf(“x = %c , x=0x%x \n”,x, x );
printf(“y = %c , y=0x%x \n”,y, y );
字符串 “ ”
“hello” 只要有双引号,在字符串的最后就会有一个空字符’\0’
‘h’ ‘e’ ‘l’ ‘l’ ‘o’ ‘\0’
在运行过程中数值会发生变化的
变量名是由字母和下划线开头,由数字、字母、下划线组成的
定义一个字符型变量
char c = ‘a’ ; // 用常量‘a’给变量c赋初值
char _3c = ‘a’ ;
char val = ‘a’ ;
以上,实际写入到内存的是字符‘a’所对应的ASCII码值
Oct Dec Hex Char
141 97 61 a
char c = ‘a’; ==等价于=> char c = 97 ;
变量的定义:
按数据类型在内存中申请指定大小的字节空间
1)【数据的作用域】 数据类型 变量名;
2)【数据的作用域】 数据类型 变量名 = 初值;
作用域:static 静态变量 ,按需求设置
数据类型: 是必须的
基本数据类型有:
char 占用1个字节(1Byte ,1B)
char 带符号数,最高位是符号位(为1是负数,0表示正数)
0000 0000 0
0000 0001 ~ 0111 1111 表示正数(1 ~~ 127)
1000 0000 ~ 1111 1111 表示负数(-128 ~-1)
负0就是-128
取值范围是 -128 ~ 127 (-27 ~~27-1 )
unsigned char 无符号数
0000 0000 ~ 1111 1111 对应的是0到255
(0 ~~ 28-1 )
char z = 129;// 1000 0001
printf("z=0x%hhx, z=%hhd , z=%hhu\n", z, z , z);
%x是把内存中的数据直接输出(4B)
%d 是把数据输出成带符号的十进制数(4B)
%u 是把数据输出成无符号的十进制数(4B)
如果只需要打印1B的数据用 hh表示4的一半再一半
如果只需要打印2B的数据用 h表示4的一半
z=0x81 , z=-127 , z=129
证明已经把10000001写入到内存
%d需要把这个数据当成是带符号的补码,需要显示出其原码
1000 0001 -1 ==》反码 1000 0000
==》原码 1 111 1111 ==》-127
在计算机中,默认是以补码的方式存放数据
正数的补码值等于它本身的值(原码)0000 1000
负数的补码值为其原码取反后+1
char a= -1; // 1000 0001 原码
其反码是除了符号位全部取反为1111 1110
实际写到内存的补码,为反码+1 ,也就是 1111 1111
用正数给变量赋值,编译器直接就把它的原码(补码)写入到内存;
用负数给变量赋值,编译器会找到它的补码再写入到内存;
思考: char a = 135;
和 unsignedchar b = 135 ;
实际写入内存的有没有区别?(没有)
在使用的时候有没有区别?
(自动类型转换带符号转成无符号~)
a+5 和 b+5的结果是否一致
结果用打印没有区别
short 短整型
占用2个字节(2Byte ,2B)
(-215~~ 215-1 )
unsigned short (0~~ 216-1 )
int 32位占用4个字节(4Byte ,4B)
64位占用4个字节(4Byte ,4B)
unsigned int
float 单精度浮点型 带有小数点 %f
32位占用4个字节(4Byte , 4B)
64位占用4个字节(4Byte ,4B)
unsigned float
float x = 0.01;
float x = 1e-2 ;
float y = 10000.0;
float y = 1e4 ;
long 长整型 %ld %lu %lx
32位占用4个字节(4Byte , 4B)
64位占用8个字节(4Byte ,4B)
unsigned long
double 双精度浮点型 带有小数点的 %lf
32位占用8个字节(4Byte , 4B)
64位占用8个字节(4Byte ,4B)
unsigned double
long double类型用%llf打印
bool / _Bool
需要加头文件
#include
布尔变量,用来判断真假及条件是否成立,只能是0或者1
true 为1 false 为0
类型转换
int a = 5;
double b = a / 2 ;
请问b为多少 2.000000 在除的时候,a依旧是int整型,
a/2得到的是整数部分,所以就是整数2
赋值的时候double就会把2变成是带小数点的浮点数,赋值给b (自动类型转换)
a / 2 为多少 a/2得到的是整数部分,所以就是整数2
(double)a/2 其中是先对整型变量a做了强制类型转换,
在这条语句中暂时作为浮点数进行运算,
(double)a/2得到的就是2.500000
(double) (a/2) 是把a/2的结果强制类型转换,
a/2得到的是整数部分,所以就是整数2
(double)(a/2) = 2.000000
自动类型转换在运算过程中自己转换的
强制类型是针对变量或者表达式或者函数的返回值,用(新类型)来实现强制类型转换
表达式和语句
表达式由变量、运算符等组成
a=1 a +1 a+b a++ a > b
语句才可以代码中独立存在, 必须有分号
a +=1; a+1 ;