数据类型的详细介绍 (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; }
原文:https://blog.51cto.com/u_15157811/2805036