#include <cstdio>
#include <iostream>
#include <string>
#include <bitset>
using namespace std;
typedef unsigned int uint32_t;
void inet_ntoa(uint32_t in)
{
char b[18];
register char *p;
p = (char *)∈
#define UC(b) (((int)b)&0xff)
sprintf(b, "%x.%x.%x.%x\n", UC(p[0]), UC(p[1]), UC(p[2]), UC(p[3]));
printf(b);
}
int main()
{
/**联合体与位域测试*/
union //联合体总共用一个存储空间,每个变量的起始地址相同, char 类型 最大一个字节长度, 8位
{
struct //占6位
{
unsigned char a:1;
char b:2;
char c:3;
}d;//位域 d 位域的正负与编译器有关, 尽量使用 无符号类型数据表示 位域
char e;
} f;
f.e = -2;
//二进制 表示 : 1111 1110(0000 0010 取反 加 1 )
// <---- 内存增大
// c b a
// | | |
//111 11 0
printf("a = %d, b = %d, c = %d \n",f.d.a, f.d.b, f.d.c);//输出为 0 , -1 , -1;
printf(" e = %p, d = %p\n", &f.e, &f.d); // 两者地址一样 001DF90F
f.e = -102;
//二进制 表示 : 1011 0110(0100 1010 取反 加 1 )
// <---- 内存增大
// c b a
// | | |
//011 01 0
printf("a = %d, b = %d, c = %d \n",f.d.a, f.d.b, f.d.c);//输出为 0 , 1 , 3;
printf(" e = %p, d = %p\n", &f.e, &f.d); // 两者地址一样 001DF90F
/** 大小端模式测试*/
inet_ntoa(0x12345678);//大端模式: 高字节存低地址, 低字节存高地址; 输出为12 34 56 78(大端) 78 56 34 12 (小端);
inet_ntoa(0x87654321);//小端模式: 低字节存低地址 高字节存高地址 输出为 21 43 65 87(小端) 87 65 43 21 (大端);
/**字符转INT*/// char 类型有符号 表示的范围为 -127 - 128 之间
char a1 = 128;
bitset<8> b1(128);
cout << b1 << endl; // 1000 0000;符号位 1, 数据量 为 128 符号位和数值为重合
char a2 = -129;
bitset<8> b2(-129);// 1000 0001;(129 二进制表示)
cout << b2 << endl;// 0111 1111; 补码截断后剩余数据 符号位为 0
int a11 = a1;
int a22 = a2;
printf("a11 = %d, a22 = %d\n",a11, a22);//a11 = -128 , a22 = 127; //符号位 使用char 的符号位
return 0;
};
字符 赋值给INT 大小端模式 联合体 位域 等 基础知识简单整理
最新推荐文章于 2023-07-03 21:30:34 发布