携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第20天,点击查看活动详情
:star: 重点归纳总结
- 计算机中数据的存储和计算都是以补码的形式进行的!
- 整型提升还有截断的对象也是针对补码。
- 无符号整型提升,二级制位补充
0,有符号整型提升,二进制位补充符号位。 %u(无符号打印)自动认为打印的数据是无符号数据,所以存储的补码也就是原码,%d(有符号打印)认为打印的数据是有符号类型的,要将数据转换成原码打印输出!
:sweat_drops: 浮点型在内存中的存储
我们已经学会了整型在内存中的存储,你肯定会好奇,浮点型数据该怎样存储在内存中呢?
常见的浮点数:
3.14159 1E10 2.7
浮点数家族包括:
float、double、long double 类型。
浮点数表示的范围:
vs中float.h有详细介绍浮点数的表示范围,有兴趣的伙伴可以期查阅一下,bug郭截取了一段供大家参考:
// float.h
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// Implementation-defined values commonly used by sophisticated numerical
// (floating point) programs.
//
#pragma once
#ifndef _INC_FLOAT // include guard for 3rd party interop
#define _INC_FLOAT
#include <corecrt.h>
#pragma warning(push)
#pragma warning(disable: _UCRT_DISABLED_WARNINGS)
_UCRT_DISABLE_CLANG_WARNINGS
_CRT_BEGIN_C_HEADER
#ifndef _CRT_MANAGED_FP_DEPRECATE
#ifdef _CRT_MANAGED_FP_NO_DEPRECATE
#define _CRT_MANAGED_FP_DEPRECATE
#else
#ifdef _M_CEE
#define _CRT_MANAGED_FP_DEPRECATE _CRT_DEPRECATE_TEXT("Direct floating point control is not supported or reliable from within managed code. ")
#else
#define _CRT_MANAGED_FP_DEPRECATE
#endif
#endif
#endif
大家肯定会疑问,这是个啥,看不懂啊,其实bug郭也看不懂,哈哈哈,不过问题不大!
浮点型的其类型说明符有
float单精度说明符,double双精度说明符。在Turbo C中单精度型占4个字节(32位)内存空间,其数值范围为3.4E-38~3.4E+38,只能提供七位有效数字。双精度型占8个字节(64位)内存空间,其数值范围1.7E-308~1.7E+308,可提供16位有效数字。
兄弟们,我们写个代码看看,你就了解了浮点型!
#include<stdio.h>
int main()
{
int n = 9;
float *pFloat = (float *)&n;
printf("n的值为:%d\n",n);
printf("*pFloat的值为:%f\n",*pFloat);
*pFloat = 9.0;
printf("num的值为:%d\n",n);
printf("*pFloat的值为:%f\n",*pFloat);
return 0;
}
输出结果会是怎么样的?会是像我们整形数据那样分析吗? 结果肯定是否定的!
运行结果:
可以看到打印结果完全出乎我们意料,
num 和*pFloat 在内存中明明是同一个数,为什么浮点数和整数的解读结果会差别这么大?
要理解这个结果,一定要搞懂浮点数在计算机内部的表示方法。所以我们可以知道,浮点型数据和整型数据在计算机中有着不一样的存储方式!