数据类型的详细介绍 (1.内置类型 2.自定义类型(构造类型))
整形在内存中的存储:原码、补码、反码
大小端字节序介绍及判断
浮点型在内存中的存储解析
整形家族: char unsigned char 0-255 //无符号字符 signed char -128-127 //有符号字符 short unsigned short [int] signed short [int] int unsigned int signed int long unsigned long [int] signed long [int] 浮点型家族: float double 构造类型: > 数组类型 > 结构体类型 struct > 枚举类型 enum > 联合类型 union 指针类型 int* pi; char* pc; float* pf; void* pv; 空类型: void 表示空类型(无类型) 通常应用于函数的返回类型、函数的参数、指针类型
(1).有符号数(整形)有三种表示方法,即原码、反码、补码,其中正数原反补相同。
(2).无符号数也是有三种表示 原、反、补,只不过原反补都相同。
(3).三种表示方法均有符号位和数值位两部分,符号位都是用0表示表示"正",用1表示"负",而数值位三种表示方法各不相同
整数:
1.有符号数
正数:原码、反码、补码 相同
负数:原码、反码、补码 不同,要进行计算
2.无符号数:
原码、反码、补码相同
//原码 // 直接将二进制按照正负数的形式翻译成二进制就可以 // 列如: // int a = 20;//4个字节-32bit ,正数原反补相同 // 00000000000000000000000000010100 - 原码 // 00000000000000000000000000010100 - 反码 // 00000000000000000000000000010100 - 补码 // 0x00000014 - 16进制形式 // //反码 // 将原码的符号位不变,其他位依次按位取反就可以得到了 // 列如: // int b = -10; // 10000000000000000000000000001010 - 原码 // 11111111111111111111111111110101 - 反码 // //补码 // 将反码+1得到补码 // 例如 // int b = -10; // 11111111111111111111111111110101 - 反码 // 11111111111111111111111111110110 - 补码 // 0xFFFFFFF6 //对于整形来说:数据存放在内存中其实存放的是补码
大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中(大端字节序)
小端(存储)模式,是指数据的低位保存在内存的底地址中,而数据的高位,保存在内存的高地址中(小端字节序)
// int a = 20; // //0x 00 00 00 14 // //在内存中 // //小端 // //14 00 00 00 // //大端 // //00 00 00 14
int main() { int a = 1; char* p = (char*)&a; //判断内存中第一个字节的值是否为1 if (*p == 1) { printf("小端\n"); } else { printf("大端\n"); } return 0; } //结果为:小端 封装成函数 int check_sys() { int a = 1; char* p = (char*)&a; //返回1,小端 //返回0,大端 return *p; } int main() { int ret = check_sys(); if (ret == 1) { printf("小端\n"); } else { printf("大端\n"); } return 0; }
9.0 1001.0 //二进制 //浮点型在内存中的存储方式 (-1)^0 * 1.001 * 2^3 (-1)^S * M * 2^E E=0 , M=1.001, E=3
int main() { float f = 5.5; //5.5 //101.1 //(-1)^0 * 1.011 * 2^2 //S = 0 M =1.011 E=2 // S 127+E 8bit M 23bit //转化为二进制 // 0 10000001 01100000000000000000000 //0100 0000 1011 0000 0000 0000 0000 0000 //0x40b00000 return 0; }
int main() { int n = 9; //0 00000000 00000000000000000001001 - 补 // float* pfloat = (float *)&n; printf("n的值为: %d\n", n); //9 printf("*pfloat的值为: %f\n", *pfloat); //0.000000 //(-1)^0 * 00000000000000000001001 * 2^-126 *pfloat = 9.0; //1001.0 //1.001*2^3 //(-1)^0 * 1.001 * 2^3 //0 10000010 00100000000000000000000 printf("num的值为: %d\n", n); //1091567616 printf("*pfloat %f\n", *pfloat); //9.000000 return 0; }
#include <stdio.h> 输出什么 int main() { char a = -1; //10000000000000000000000000000001 //11111111111111111111111111111110 //11111111111111111111111111111111 //11111111 - 取一个字节 //输出的是%d //11111111111111111111111111111111 - 补 //11111111111111111111111111111110 - 反码 //10000000000000000000000000000001 - 原 signed char b = -1; //11111111 unsigned char c = -1; //原反补相同 //11111111 //00000000000000000000000011111111 = 255 printf("a=%d,b=%d,c=%d", a, b, c); return 0; } int main() { char a = -128; //10000000000000000000000010000000 //11111111111111111111111101111111 //11111111111111111111111110000000 -补 //10000000 //11111111111111111111111110000000 -补原相同 printf("%u\n", a); //%u - 打印十进制的无符号数字 //%d - 打印十进制的有符号数字 return 0; } int main() { int i = -20; unsigned int j = 10; printf("%d\n", i + j); } #include <Windows.h> int main() { unsigned int i; for (i = 9; i >= 0; i--)//i是无符号数 所以死循环 { printf("%u\n", i); Sleep(100); //间隔100毫秒 } return 0; } int main() { char a[1000]; int i; for (i = 0; i < 1000; i++) { a[i] = -1 - i; } printf("%d", strlen(a)); //-1到-128 再减1 变为127-1 再到0停止 return 0; } unsigned char i = 0; //0-255 int main() { for (i = 0; i <= 255; i++) { printf("hello world\n"); } return 0; }