相比其他的博客,本博客就主打一个简单干练,精华萃取。话不多说,直接开搞
我们先来看一个例子
int a=10;
long long b=20;
这里定义了两个变量a和b,从右向左看10赋值给变量a,a的类型是int ,int占四个字节,表明在内存中我们给变量a开辟了四个字节大小的内存空间。同理b被声明为long long类型,在内存中给它分配了8个字节的空间。整数在内存中存的是10的二进制表示吗?
整数在内存中存的是补码。不是直接的二进制表示。
原码:即为当前值的二进制表示
反码:符号位(第一位)不变,其他为按位取反(1变0,0变1)
补码:反码加一
值得一提的是正数的原码与补码相同
大端字节序(Big Endian)
高位字节数据存放在内存低地址处,低位字节数据存放在内存高地址处。
小端字节序(Little Endian)
高位字节数据存放在内存高地址处,低位数据存放在内存低地址处
举个例子:
例如:int a=1
假设内存地址从左往右由高到低
0x 00 00 00 01 这就是小端字节序,因为01存在了低地址处
而
0x 01 00 00 00 就是大端字节序,因为01存在了高地址处
如何判断一个机器的大小端呢?
int check_sys()
{
int a = 1;
return *(char*)&a;
}
int main()
{
int ret = check_sys();
if (ret == 1)
printf("小端");
else
printf("大端");
return 0;
}
int main()
{
char a[1000];
int i;
for ( i = 0; i < 1000; i++)
{
a[i] = -1 - i;
}
printf("%d ", strlen(a));// 255,找到0之前的字符个数 -1到-128,127到0,总计128+127=255
//signed char 取值范围0->127,(-128)->(-1)
//unsigned char 取值范围0->255 10000000
return 0;
}
事实上直到20世纪80年代, 还是计算机厂商各自为战, 每家都在设计自己的浮点数存储规则, 彼此之间并不兼容. 直到1985年, IEEE754标准问世, 浮点数的存储问题才有了一个通用的工业标准.
IEEE754提供了四种精度规范, 其中最常用的是 单精度浮点型 和 双精度浮点型 , 但IEEE754并没有规定32位浮点数类型需要叫做 float, 或64位浮点数需要叫做 double. 它只是提供了一些关于如何存储不同精度浮点数的规范和标准. 不过一般情况下, 如果我们提到 float, 其实指的就是IEEE754标准中的32位单精度浮点数. 如果我们提到 double, 其实指的就是IEEE754标准中的64位双精度浮点数。
推荐看这篇
知乎大佬的文章
第一次用markdown编辑器,确实比之前的清晰很多,如果对你有帮助,点个赞再走吧