目录
1. 整形在内存中的存储
原码、反码(符号位不变,其他位取反)、补码(反码+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;
int a = 0x1234;//0x1234 = 0x 00 00 12 34
//内存中实际上是:0x 34 12 00 00
char b = *(char *)&a;
//char* 类型解引用后只能访问一个字节,所以 b = 0x34;
printf("%d\n", b);//以%d打印b时,整型提升, 0x34 = 52
2. 浮点型在内存中的存储
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进制)
根据国际标准
IEEE
(电气和电子工程协会)
754
,任意一个二进制浮点数
V
可以表示成下面的形式:
(-1)^S * M * 2^E
(-1)^s
表示符号位,当
s=0
,
V
为正数;当
s=1
,
V
为负数。
M
表示有效数字,大于等于
1
,小于
2
。
2^E
表示指数位。