内置类型:
- //数据类型中的内置类型
- // char //字符数据类型
- // short //短整型
- // int //整型
- // long //长整型
- // long long //更长的整型
- // float //单精度浮点数
- // double //双精度浮点数


- //数据类型中的内置类型 单位是字节
- // char //字符数据类型 1
- // short //短整型 2
- // int //整型 4
- // long //长整型 4/8
- // long long //更长的整型 8
- // float //单精度浮点数 4
- // double //双精度浮点数 8
-
-
- //整数数据的二进制表示形式有三种:原码,补码,反码
- //三种方法的均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示负
- //数值位正数的原、反、补码都相同
- int main()
- {
- //INT_MAX;
- int num = 10;//创建一个整型变量,叫num,这时num向内存申请4个字节来存放数据
- //4个字节-32比特位
- //00000000000000000000000000001010 原码
- //00000000000000000000000000001010 反码
- //00000000000000000000000000001010 补码
- int num1 = -10;
- //10000000000000000000000000001010 原码
- //11111111111111111111111111110101 反码
- //11111111111111111111111111110110 补码
-
- return 0;
- }
-
-
- //字符存储的时候存储的是ASCII码值,存储的是ASCII码值,是整型,所有归类的时候放在整型家族
- //计算1-1 = 1+(-1)
- //原码计算错误
- //0000000000000000000000000000001
- //1000000000000000000000000000001
- //1000000000000000000000000000010
-
- //补码计算
- //0000000000000000000000000000001 1的补码
- //1111111111111111111111111111111 -1的补码
- //0000000000000000000000000000000
字节序和大小端:
- //1.字节序 - 是以字节为单位,讨论存储顺序的
- //2.小端字节序存储:把一个数据的低位字节的内容,存放在低地址处,把一个数据的高位字节的内容,存放在高地址处
- //大端字节序存储:把一个数据的低位字节的内容,存放在高地址处,把一个数据的高位字节的内容,存放在低地址处
-
-
- // int main()
- // {
- // int a = 0x11223344;
- // return 0;
- // }
-
- //写个程序,如何来判断大小端
-
- //小端返回1
- //大端返回0
- int check_sys()
- {
- int a = 1;
- // if(*(char*)&a ==1)
- // {
- // return 1;
- // } else
- // {
- // return 0;
- // }
- return *(char*)&a;
- }
-
- int main()
- {
- int ret = check_sys();
- if(ret==1)
- {
- printf("小端\n");
- } else
- {
- printf("大端\n");
- }
- // int a = 1;
- // char* p = (char*)&a;//int*
- // if(*(char*)&a ==1)
- // //if(*p == 1)
- // {
- // printf("小端\n");
- // } else
- // {
- // printf("大端\n");
- // }
-
- return 0;
- }
判断有符号位和无符号位的区别:


- //对于整型家族类型来说,有符号和无符号的区分
- //char 到底是signed char 还是unsigned char 不确定
- //char 在VS上 --> signed char
- //short == signed short
- //unsigned short
- //int ==signed int
- //unsigned int
-
- int main()
- {
- char a = -1;
- //10000000000000000000000000000001
- //11111111111111111111111111111110
- //11111111111111111111111111111111 -截断
- //11111111 -a
- //11111111111111111111111111111111
- //11111111111111111111111111111110
- //10000000000000000000000000000001
- signed char b = -1;
- //11111111111111111111111111111111 -截断
- //11111111 -b
- //11111111111111111111111111111111
- //11111111111111111111111111111110
- //10000000000000000000000000000001
- unsigned char c = -1;
- //11111111 -c
- //00000000000000000000000011111111
- printf("a=%d\n,b=%d\n,c=%d\n",a,b,c); // -1 -1 255
- //%d - 十进制的形式打印有符号整型整数
- //整型提升
-
- return 0;
- }
-
- // int main()
- // {
- // char a = -128;
- // //10000000000000000000000010000000 补码
- // //11111111111111111111111101111111 反码
- // //11111111111111111111111110000000 原码
- // //-128补码
- // //10000000
- // //11111111111111111111111110000000
- // printf("%u\n",a); //打印无符号位十进制整数 4294967168
-
- // return 0;
- // }
-
- // int main()
- // {
- // char a = 128;
- // //00000000000000000000000010000000 原反补相同
- // //128补码
- // //10000000
- // //11111111111111111111111110000000
- // printf("%u\n",a); //打印无符号位十进制整数 128
-
- // return 0;
- // }
-
- int main()
- {
- int i = -20;
- //10000000000000000000000000010100
- //11111111111111111111111111101011
- //11111111111111111111111111101100
- unsigned int j = 10;
- //00000000000000000000000000001010
- //11111111111111111111111111101100
- //11111111111111111111111111110110 i+j 补码
- //11111111111111111111111111110101
- //10000000000000000000000000001010 -10
- printf("%d\n", i+j); //-10
-
- return 0;
- }
有无符号练习题:
- // int main()
- // {
- // //unsigned int i; //全部变成无符号,死循环
- // int i;
- // for (i = 9;i >= 0;i--)
- // {
- // printf("%u\n",i);
- // sleep(1); //单位是秒
- // }
-
- // return 0;
- // }
-
- // int main()
- // {
- // char a[1000]; //char -128~127
- // int i;
- // for (i = 0; i < 1000; i++)
- // {
- // a[i] = -1 -i;
- // }
- // printf("%d\n",strlen(a)); //255
- // }
-
- unsigned char i = 0; //变成无符号,死循环
- int main()
- {
- for(i = 0; i <= 255; i++)
- {
- printf("hello world\n");
- }
- return 0;
- }
num和*pFloat 在内存中明明是同一个数,为什么浮点数和整数的解读结果会差别这么大?要理解这个结果,一定要搞懂浮点数在计算机内部的表示方法。
详细解读 :
根据国际标准IEEE ( 电气和电子工程协会)754,任意一个二进制浮点数V可以表示成下面的形式
(-1)^S*M*2NE
。(-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。
M表示有效数字,大于等于1,小于2.
2^E表示指数位。
举例来说:十进制的5.0,写成二进制是 101.0,相当于 1.01x2入2。那么,按照上面V的格式,可以得出s=0M=1.01 ,E=2。
十进制的-5.0,写成二进制是-101.0,相当于-1.01x2^2。那么,s=1,M=1.01,E=2。
IEEE 754规定:对于32位的浮点数,最高的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M。




- #include
- #include
-
- //浮点型在内存中的存储
- //浮点数:数学中的小数
- //整型和浮点型在内存中的存储方式有差异
- // int main()
- // {
- // int n = 9;
- // //00000000000000000000000000001001
- //S E M
- //0 -126 0.00000000000000000001001
- //(-1)^0 * 0.00000000000000000001001 * 2^-126
- // float* pFloat = (float*)&n;
- // printf("n的值为:%d\n",n); //9
- // printf("pFloat的值为:%f\n",*pFloat); //0.000000 小数点后六位
-
- // *pFloat = 9.0;
- //1001.0
- //1.001 * 2^3
- //(-1)^0 * 1.001 * 2^3
- //S=0 E=3 M=1.001
- // printf("num的值为:%d\n",n); //1091567616
- // printf("*pFloat的值为:%f\n",*pFloat); //9.000000
-
- // return 0;
- // }
-
- int main()
- {
- float f = 5.5;
- //101.1
- //1.011 * 2^2
- //(-1)^0 * 1.011 * 2^2
- //S=0,M=1.011,E =2
- // 0100 0000 1011 0000 000000000000000
- // 0x40b00000
- return 0;
- }