整形和浮点型
整形
###有符号数(正数和负数)=>
计算机中的整形有符号数有三种表示方法,即原码、反码和补码。
三种表示方法均有符号位和数值位,符号位 0=>正 1=>负
原码>>>>将十进制按二进制形式翻译成正负的二进制。
反码>>>>将原码的符号位不变,其它位按位取反。
补码>>>>反码+1=补码。
正数的原码、反码和补码是相同的,负数需要计算
计算机系统中,数值全部都是补码来表示和存储。原因使用补码可以将符号位和数值域做统一的处理,同时加减法也可以做统一处理(CUP只有加法器)。
###无符号数
无符号数的原码、反码和补码全部相同。
####大端小端
大端(存储)模式是指数据的低位保存在内存的高地址中,数据的高位保存在内存的高地址中。(11 22 33 44)
小端(存储)模式是指数据的高位保存到内存的低地址中,数据的低位保存在内存的高地址中。(44 33 22 11)
eg:百度笔试题(请简述大端字节和小端字节的概念,设计一个小程序来判断当前机器的字节序)
#include<stdio.h>
int main()
{
//返回 1 小端
//返回 0 大端
int a = 1; //00000000 00000000 00000000 00000001(二进制)
//00 00 00 01(十六进制)小端存储
//01 00 00 00 (十六进制)大端存储
char* p = (char*)&a;//(char*)=>将int型强制转化为char型拿到一个字节的内容
if (*p == 1)
printf("小端");
else
printf("大端");
return 0;
}
也可以用函数将其封装。 eg:
int chek_sys()
{
int a = 1;
char* p = (char*)&a;
return *p;
//2.int a = 1;
//char* p = (char*)&a;
//if (*p == 1)
//return 1;
//3.int a = 1;
//return *(char*)&a;
}
#include<stdio.h>
int main()
{
int ret = chek_sys();
if (ret == 1)
{
printf("小端");
}
else
{
printf("大端");
}
return 0;
}
浮点型
浮点型的存储
浮点型的存储和整形有较大的差别,看下面的代码 #include<stdio.h>
int main()
{
int a = 9;
float* p = (float*)&a;
printf("%d\n",a);
printf("%f\n", p);
float n = 9.0;
int* b = (int*)&n;
printf("%f\n",n);
printf("%d\n", b);
return 0;
}
为什么会这样呢;浮点型的存储和拿取是和整形不同的下面详细看一下
(-1)^SM2^E (将十进制转化为二进制)
(-1)^S=>表示浮点数的正负 (S为0 或1)
1<=M<2(1.xxxxxxx xxxxx表示小数位,在内存中M的首位默认为1,所以只保存小数位)
E为一个无符号整数 如果E为8位 0-255 中间数127 E为11位0-2047中-1023(E全为0是表示一个非常接近0的数,E全为1是表示一个非常大的数+-无穷大)
科学计数法中E可以为负数所以(IEEE754)规定存入内存的真实值必须加上一个真实值。
例如:2^10的E为10,所以保存为32位的浮点数是必须保存为10+127(=>10001001)。