C语言数据运算和自定义数据类型

一、C语言的unsigned、signed关键字解析

signed int a1 = -2;
unsigned int a2 = -2;

1. 区别

  1. 除法:在计算机里面是右移一位,于是最高位会空出一位。而空位补的值和它的有无符号的属性有关。

    • signed: 补符号位
    • unsigned: 补0
  2. 加法:在内存上,直接按照加法进行操作,在一块新的内存存储。
    如果让这个新的内存去和另一块内存进行逻辑运算,那么需要对这两块内存进行解码,有两种解码方式:

    • 补码解码:新的内存约束是有符号的
    • 正权重解码:新的内存约束是无符号的

    无符号+有符号算得的新内存变为无符号内存

二、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;
};

SUFE大二在读