1.C语言中的数据类型
1).基本类型(整形数、浮点数)
2).构造类(数组、结构体、联合体、枚举)
3).指针类型
4).void类型。
typeof(X)表示X的数据类型,整数默认int类型,浮点数默认double类型
数组类型大多可以相互转换。不同类型相加减向高精度的转换。
1.基本类型(整形数、浮点数)
1)整数类型:int,short,long,double,float,char
1个字节=1byte = 8bit
char/unsigned char 占1个字节 (字符型) -保存字符对应的ASCII值
short/unsigned short 占2个字节 (存储形式在后面)
int/unsigned int 占4个字节
long/unsigned long 占4个字节 long long占8个字节(使用sizeof可以计算占字节数)
signed(默认) 表示有符号 储存符号位为最高位。1为正数,0为负数
unsigned 表示无符号 所有字节都为 数值位
2)浮点数:
float : 单精度浮点数 4字节
double: 双精度浮点数 8字节
long double : 长双精度浮点数 16字节
2.构造类型:自己构造出来的类型
数组 :一维数组、二维数组,
int a[10]; 可以存放10个int类型的数组
数组的下表为0~9,a[10]越界,
结构体:类似于定义一个对象 占的大小为结构体中所有属性的和(注意补倍数 char+int =1+4+3=8位)
struct student
{
char name[]; 字符串类型
int age;
};
联合体:共用一个内存空间 占用大小为最大的数据类型
union a
{
int a;
char b;
};
枚举:预先定义好,有点类似于#define
enum a
{
one = 1, //若未赋值默认为0,后面一次累加。
twe = 2,
};
3.指针类型 在32位操作系统中指针占4个字节,在64位中占8个字节。
int * p=NULL; 定义注意定义空指针,也不要定义野指针(int *p)
int *p=NULL;
需要先定义申请molloc(或指向存在)的空间
*p代表直线的值 &p 代表(指针p)存放的空间 p表示指针指向的空间。
个人理解为三层 &p -p -*p
*&p = p; &*p=ERROR
4.void类型
void*表示通用指针,在部分函数中可以看到
void 作为函数参数表示没有参数
void 作为函数返回值表示没有返回值
2.变量
在程序的运行期间,可以改变其值的数据对象。
存储变量会有一个存储单元。
并且这个存储单元必须是可写的(因为我们要改变他的值)
1)变量的定义
变量类型 变量名 = 变量的值;
int a=1;
变量名:一个对象的名字,标识符标识符: 用来标识一个东西的符号
在C语言里面标识符:
只能由字母,数字,下划线组成,第一个字符必须是字母或者下划线。
2)变量的存储
定义变量时会开辟一块空间,用于存储这个变量,变量存在左值(地址值&a)和右值(变量的值a)
3.整数的存储
整数的二进制的补码形式
正数:
正数的补码就是其原码本身
原码: 就是把它相应正数转化成二进制序列
如 char 6 : 0000 0110
负数:
负数的补码就是它的绝对值的原码 取反 +1
13 : 8bits
|-13| = 13 :
13原码 : 00001101
取反 : 11110010
+1 : 11110011
计算源码会发现:一个负整数会和一个比较大的正整数的补码是一样,如-2和254 都是1111 1110
计算机中存储的形式时不会变的,关键时看调用时使用的是什么,%d 表示输出int型的有符号的整数,%u表示输出int型无符号的整数,
注意判断首位是否表示符号,
如:int a = -2;
-2 = > |-2| : 00000000 00000000 00000000 00000010
取反 : 11111111 11111111 11111111 11111101
+1 : 11111111 11111111 11111111 11111110
printf("%d\n", a); // -2
printf("%u\n", a); // 2^32 - 2
unsigned int a = -1u;
-1 补码形式:
|-1| : 00000000 00000000 00000000 00000001
取反 : 11111111 11111111 11111111 11111110
+1 : 11111111 11111111 11111111 11111111
printf("%d\n", a); // -1
printf("%u\n", a); // 2^32 - 1
4. 整数之间赋值的问题
在C语言,允许不同类型的整数之间相互赋值,
长->短 舍弃原码中的高字节
短->长 有符号补高字节,无符号(定义unsigned类型的)补0
-1: 11111111 11111111 11111111 11111111
(char)-1 11111111
%d 11111111 11111111 11111111 11111111
%u 11111111 11111111 11111111 11111111
printf("%d\n", (char)-1); -1
printf("%u\n", (char)-1); 2^32-1
/-------------------------------------------------------------/
-1: 11111111 11111111 11111111 11111111
(unsigned char)-1 11111111
%d 00000000 00000000 00000000 11111111
%u 00000000 00000000 00000000 11111111
printf("%d\n", (unsigned char)-1); 255
printf("%u\n", (unsigned char)-1); 255
/-------------------------------------------------------------/
5.常量
在程序的运行当中,不能够改变其值的数据对象
常量在我们的代码里面有几种:
(1)整型常量
在我们代码中,代表整数的常量值。
八进制常量: 0[0-7]+以字符0开头,后面接0个或者是多个0~7的字符
eg:
0123
0777
0778 ERROR
int a = 0123;
printf("%d\n", a);//83
八进制与二进制对应关系:一个八进制位 对应是三个二进制的位
八进制 二进制
0 000
1 001
2 010
7 111
十进制:[0-9]*
一个或者是多个0~9的字符组成
十六进制:
以0x 或 0X 开头,后面接一个或多个 0-9 A-F a-f
int a = 0xf3;
十六进制与二进制对应的关系
一个十六进制位 对应四个二进制的位
十六进制 二进制
0 0000
1 0001
Bb 1011
Ff 1111
255 -> 0xff
(2)字符常量
字符常量用单引号引起来的一个或者是多个字符的序列在计算机中保存了字符对应的ASCII %c输出可以输出字符
ASCII:由于字符不超过256,所以把我们整数值都会去对应一个字符
A~Z 65-90
a-z 97~122
0~9 48~57
(1)普通字符
可以打印的字符,有形状的字符
'A' - 'Z'
'a' - 'z'
'0' - '9'
(2)特殊字符
转义字符:不能够打印出来的,没有形状字符'\n' '\r
'\OOO' : 由\后面接一个或两个或三个 八进制数字组成
这些八进制数字来表示它所期望的那一个字符ASCII
'A' --- '\101'
char c = '\101';
'\xOO' : 由\x 后面接一个或两个 十六进制数字组成
表示十六进制数字所期望的那一个字符的ASCII
'A' 101 65 41
char c = 'A';
char c = '\101';
char c = '\x41';
char c = 0101;
char c = 65;
char c = 0x41;
(3)浮点常量
小数:由整数部分、小数部分、小数点、一个e\E、一个可选的带符号的
整数指数和一个可选的表示类型的后缀(f/F/l/L)
f/F: float
l/L: long double
没有后缀: double
float f = 2.3E3 ; E表示10的次方 此为10的3次方相当于*1000
整数部分:可以省略
小数部分:可以省略
但是整数和小数部分不能够同时省略。
float f = .3E3; OK
float f = 5E-5; OK
float f = E5; ERROR //整数和小数部分不能够同时省略
本文为个人(萌新)学习根据笔记复习形成,如有错误请各位指导。
这篇博客介绍了C语言中的数据类型,包括基本类型、构造类、指针类型和void类型,并详细阐述了变量的概念、整数的存储方式以及整数之间赋值的规则。同时,也提及了常量的使用和分类。
9959

被折叠的 条评论
为什么被折叠?



