//int a = 10;
//正数的源码,反码,补码相同
// 0000 0000 0000 0000 0000 0000 0000 0000 0000 1010 源码
// 0000 0000 0000 0000 0000 0000 0000 0000 0000 1010 反码
// 0000 0000 0000 0000 0000 0000 0000 0000 0000 1010 补码
//
// a=-10
// 负数的
// 1000 0000 0000 0000 0000 0000 0000 0000 0000 1010 源码
// 1111 1111 1111 1111 1111 1111 1111 1111 1111 0101 反码
// 1111 1111 1111 1111 1111 1111 1111 1111 1111 0110 补码
// 补码取反加1得源码
//
//第一位为符号位
//
//在内存中存放的是补码
//
//cpu中只有加法器+(-x)
//大小端字节序
//#include<stdio.h>
//int main()
//{
// // 11是高位字节 44是低位字节
// int b = 0x11223344;//低---------------->高 地址
// // 11 22 33 44 叫大端字节序存储
// // 44 33 22 11 叫小端字节序存储
// return 0;
//}
//写一个程序判断大小端
//#include<stdio.h>
//int main()
//{
// int a = 1;
// char* p = (char*)&a;//取a的第一个字节的地址
// if (*p == 1)
// {
// printf("小端");
// }
// else
// {
// printf("大端");
// }
// return 0;
//}
//练习
//#include <stdio.h>
//int main()
//{
// char a = -1;
// //10000000 00000000 00000000 00000001//原
// //11111111 11111111 11111111 11111110//反
// //11111111 11111111 11111111 11111111//补
// //存储在a中会发生截断
// //a-11111111
// //有符号位整形提升按照符号位提升
// //11111111 11111111 11111111 11111111//补
// //11111111 11111111 11111111 11111110//反
// //10000000 00000000 00000000 00000001//原
// signed char b = -1;
// //b-11111111
// unsigned char c = -1;
// //c-11111111
// //无符号位按0开始整形提升
// printf("a=%d,b=%d,c=%d", a, b, c);//-1 -1 255
// return 0;
//}
//正负数以补码的形式存储在数据中
//值为补码的值
//#include <stdio.h>
//int main()
//{
// char a = -128;//1000000...0010000000(-128--127)有符号char (0-255)无符号char
// //short int 通用
// //a-10000000
// //整形提升111111111111..1110000000
// printf("%u\n", a);//%u以十进制打印无符号整数4294967168
// //%u 无符号三码相同
// //%d为-128
// return 0;
//}
//#include <stdio.h>
int main()
{
//char a = 128;
00000000 000000000000000010000000
10000000-a
提升
//printf("%u\n", a);// 4294967168
int i = -20;
unsigned int j = 10;
printf("%d\n", i + j);
return 0;
}
//int main()
//{
// char a[1000];//-128--127
// int i;
// for (i = 0; i < 1000; i++)
// {
// a[i] = -1 - i;
// }
// printf("%d", strlen(a));//找\0
// //-1 -2 ...-128 127 126...1 0
// //255
// return 0;
//}
//#include <stdio.h>
//#include<windows.h>
unsigned char i = 0;
0-255
//int main()
//{
// //for (i = 0; i <= 255; i++)
// //{
// // printf("hello world\n");
// //}//死循环
// unsigned int i;
//for(i = 9; i >= 0; i--)
//{
// printf("%u\n",i);
//}//死循环
9 8 ...0 2^32...
//sleep(10000);
// return 0;
//}
//#include<stdio.h>
//int main()
//{
// int a[4] = {1,2,3,4};//01 \00 00 00 02\ 00 00 00 03 00 00 00 04 00 00 00
// int* ptr1 = (int*)(&a + 1);
// int* ptr2 = (int*)((int)a + 1);//a的地址转化成int类型为16,16加1为17,
// printf("%x,%x", ptr1[-1], *ptr2);//4 2 00 00 00
// return 0;
//}
//浮点数在内存中的存储
#include<stdio.h>
int main()
{
//s=0,e=-126,m=0.000000001001
int n = 9;//0 0000000 000000001001//9的补码 打印原码
float* pFloat = (float*)&n;
printf("n的值为:%d\n", n);//9
printf("*pFloat的值为:%f\n", *pFloat);//0.000000
*pFloat = 9.0;//1001.0==1.0010*2^3
//s=0 e=3,E=130,m=1.001
//0 100000010 0010000000000000000
printf("num的值为:%d\n", n);//1091567616
printf("*pFloat的值为:%f\n", *pFloat);//9.000000
return 0;
}
//任意浮点数都以v=(-1)^s*m*2^e存储;
// 5.5=101.1
// 科学计数法:1.011*2^2
// m=1.011;//不存储整数位
// 2^e=2^2;
//(-1)^s是符号位
//m为有效数字
//对于float类型的数e要加127
//double类型的数e要加1023
//#include<stdio.h>
//int main()
//{
// //存
// //s=0,e=2,E=2+127,m=1.011
// float f = 5.5f;
// //0 100000001 011000000000000000000
//
// //取
// //1.e不为全0或不为全1
// //1.011000000000000000000*2^e
// //
// //2.e为全0
// //为接近0的数
//
// //3.e全为1
// //为无穷大的数
// return 0;
//}
//浮点数不精确
// 不能用==来比较
//一般用abs(f-5.6)<0.0001