目录
原码、反码(符号位不变,其他位取反)、补码(反码+1)
注:原码 → 补码(符号位不变,其他位取反,再+1)
补码 → 原码(符号位不变,其他位取反,再+1)
内存中字节的顺序(小大端模式看不同的架构;):
设计一个代码来判断当前机器是大小端?
- int a = 1; // 0x 00 00 00 01(大端) 0x 01 00 00 00(小端)
- //来判断一下第一个字节是00还是01;
- //怎么获取第一个字节:通过char指针
- char* p =(char*)&a;//强制类型转换
- if(*p == 1)
- printf("小端排序\n");
- else
- printf("大端排序\n");
数据在内存中的存储或读取,也就是内存的使用,是低地址→高地址,还是高地址→低地址?
(先使用低地址,还是先使用高地址)
- char a= -1;//a补码:11111111111111111111111111111111
- //char a: 11111111,有符号时候,
- signed char b=-1;
- //char b: 11111111
- unsigned char c=-1;
- //char c: 11111111
- printf("a=%d,b=%d,c=%d",a,b,c);
- //因为是%d,整型提升:
- //有符号数:高位补符号位
- //char a: 11111111
- //提升后:11111111111111111111111111111111 转化为原码后得:-1
- //a,b一样
- //无符号位,高位补0
- //00000000000000000011111111 = 255
- //答案 -1 -1 255
- char a = -128;
- //100000000000000000000000010000000
- //111111111111111111111111110000000补码
- //char a:10000000
- printf("%u\n",a);//%u是指unsigned int格式
- printf("%d\n",a);
- //整型提升(根据char是否有符号):
- //11111111111111111111111110000000 补码:打印是u%格式,不用转换;
- //11111111111111111111111101111111
- //10000000000000000000000010000000 = -128 打印%d格式
- unsigned int i;
- for(i = 9; i >= 0; i--)
- {
- printf("%u\n",i);
- }//循环9次后会进入循环
- //定义i为无符号数,所以没有负数,i=0减1之后是一个大的正数;参考圆来表示无符号数和有符号数
- // 0 1 2 ..... 127 -128 -127 .....-1 0 1 2 .....
- // 0 1 2 ..... 255 0 1 .....255...
- char a[1000];
- int i;
- for(i=0; i<1000; i++)
- {
- a[i] = -1-i;
- }//此时a中是-1,-2,-3......,-1000
- //但是char中只能存储-127到128的数;所以-128之后就是127 126 ... 1 0
- printf("%d",strlen(a));//strlrn找到'\0'也就是0为止;一共255个
- unsigned char i = 0;
- for(i = 0;i<=255;i++)
- {
- printf("hello world\n");
- }//此循环会进入死循环:因为unsigned char 范围是0-255, 255+1=0;
float f = 5.5;
二进制101.1 = 1.011*2^2
则符号位为0,指数为129(2+127,余码系统,通过偏移量127将指数都转换为正数),尾数为011,整数位的1不用存储
0(1位) 10000001(8位) 01100000000000000000000(23位)
0x 40 b0 00 00(内存展示的是16进制)

