C语言数据运算和自定义数据类型
一、C语言的unsigned、signed关键字解析
signed int a1 = -2;
unsigned int a2 = -2;
1. 区别
-
除法:在计算机里面是右移一位,于是最高位会空出一位。而空位补的值和它的有无符号的属性有关。
- signed: 补符号位
- unsigned: 补0
-
加法:在内存上,直接按照加法进行操作,在一块新的内存存储。
如果让这个新的内存去和另一块内存进行逻辑运算,那么需要对这两块内存进行解码,有两种解码方式:- 补码解码:新的内存约束是有符号的
- 正权重解码:新的内存约束是无符号的
无符号+有符号
算得的新内存变为无符号内存
二、C语言的自定义数据类型
1. 结构体
struct abc{
int a;
char b;
int c;
};
// 由于内存对齐,sizeof(abc) = 12 == sizeof(int) * 3;
struct
可以和typedef
结合用,这样在定义变量时就可以不用在前面加上struct了。
typedef struct abc{
int a;
char b;
int c;
}s_abc;
// 匿名结构体,但是结构体里面不可以有指向自己的指针
typedef struct{
int a;
char b;
int c;
}abc;
2. 共用体
union
变量的空间是取最大的变量的那个空间,在日常开发中使用不多,在网络编程中会用到。
在接收空间大(比如int
)的那个数据的时候,空间小(比如char
)的那个变量也会被自动赋值,所以说可以利用这个特性截取某一段数据。可能某串数据的最后几位表示端口号什么的,于是我们可以直接利用这个变量获取这个端口号,而不需要做其他的处理。
union data{
int a;
short b;
char c;
};