联合体、 指针强制类型转换实现判断大小端、 用位段实现ip地址的二进制序列转化为点分十进制

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// ---------判断大小端
//		0x11223344   
//   ------------->   地址由低到高
// 大端存储方式: 11 22 33 44	高位在低地址上 (符合直觉)
// 小端存储方式: 44 33 22 11	低位在低地址上 


// 定义一个联合体
union Un {
	int n;
	char m;
};
int IsLittle() {
	// 1.-----用联合体实现:联合体内所有变量共用一块内存
	union Un num;
	num.n = 0x1;        // 把 int 型成员变量赋值为1 
	// printf("%d\n", num.m);     // 用 char 读取这段内存,
	return num.m;
}

int isLittle() {
	// 2.-----用强制类型转换实现 int* 到 char* 的转变
	// 如果是大端,强转后取0x11; 
	// 如果是小端,强转后取0x44;
	int n = 0x11223344;
	char ret = *(char*)&n;
	if (ret == 0x44) {
		return 1;     // 是小端
	}
	else {
		return 0;
	}
}
int main() {

	//判断大小端
	if (IsLittle() == 1) {
		printf("小端\n");
	}
	else {
		printf("大端\n");
	}

	system("pause");
	return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>   // 包含数据类型int32_t, int8_t

union Uu {
	int32_t n ;
	struct {
		int8_t a;
		int8_t b;
		int8_t c;
		int8_t d;
	};
}u;

int main() {
	u.n = 0x1;      
	printf("%d的点分十进制:", u.n);
	printf("%d.%d.%d.%d\n", u.a, u.b, u.c, u.d);
	
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Q_feifeiyu/article/details/88070639
今日推荐