关闭页面特效

C++入门知识总结(1)

1|0   1.有符号数和无符号数。


  这个问题其实是一个很细的问题,我们还要把问题追溯到“位”,针对不同的“位”,那么能表示的最大数的范围不同。因为计算机存储数据都是以二进制的方式去存储的,即0和1,比如 110=2^1+2^2=5,其中的计算步骤是:

   1.000->001=1

   2.001->010=2

    3.010->100=3

    4.100->101=4

    5.101->110=5

  我们可以看到一点,无论如何,如果要相对高位的数字改变的话,那么都要从最低位进位。当然有一种简单的解法,就是用2^(n-1)去计算每一位对应的数字,因为第0位是有效的(即最右边的),所以要减去1。

  下面我们步入正题,如果这个数是 unsigned __int16位的,那么在计算机中表示就是: 1111 1111 1111 1111 或者是 1 0000 0000 0000 0000-1,

由于无符号数的最高位都是可用的数字,而且没有负数,所以最终的答案为 0~(65536-1)=>256^2-1

 

  那么如果是有符号数呢?那么最高位就为符号位 0111 1111 1111 1111 或者是 1000 0000 0000 0000-1,所以答案就是256^2/2-1=65536/2-1=32767,又由于有负数存在,所以最终答案就是-32767~32767.

  我们来写一段代码来验证一下上面的理论是否正确。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;
 
int main()
{
     
    unsigned __int16 a1 = 65535; //无符号数的最大值
    unsigned __int16 a2 = 65535+65534; //无符号数的最大值乘以2
    cout << "a1="<<a1<<",a2="<<a2<< endl;
 
    __int16 a3 = 32767; //
    __int16 a4 = 32767 + 32766;
    __int16 a5 = -32767;
    __int16 a6 = -32767 + (-32766);
 
    cout << "a3=" << a3 << ",a4=" << a4 << ",a5=" << a5 << ",a6=" << a6 << endl;
 
    system("pause");
}

  下面是运行结果:

  其中 a4=-3 ,a6=3,大家可能会疑惑,为什么会是这个值呢,我是这么理解的:如果值超出了最大的范围,如果是在边界+1的这个数字的话,那么求的就是最大值的反码+1,然后再加上或者减去相应的值。比如这么说,a4=32767+1,那么值就为-32768,32767+2就为-32767,依次类推。。。。其他的类型也是一个道理,因为只是能表示的范围不一样而已,上面说的是16位的。

2|0  2.指针


   网上有关于怎么解释指针,相信很多人已经看了很多大牛们通俗易懂的解释了,我这里也来给自己的学习做一个总结吧。

我个人觉得理解指针最好的方式就是结构体,虽然这样看起来有点不太妥当,因为听说只有汇编才可以修改内存地址,不知道C语言怎么修改内存地址。

1
2
3
4
5
6
struct PointerStru
{
    int data; //数据域
    __int64  dataAddress; //地址域
    PointerStru *pNext; //直接后继
}str1,str2;

  我们可以把上面的结构体理解为一个“变量”,虽然它确实也不是变量,里面有数据域和地址域,地址里面存放的就是这个PointerStru内存块所在的“代号”。用一种比较通俗的讲法就是,图书馆里的一本书,书就是上面的data,而书所处的位置比如301号房间,就是dataAddress。

  下面我从网上找了几个例子,自己也懒得写了,反正都是大同小异,来热热身。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;
int main( )
{
   int *p1,*p2,*p,a,b;
   cin>>a>>b;  //输入两个整数
   p1=&a;  //使p1指向a
   p2=&b;  //使p2指向b
   if(a<b)  //如果a<b就使p1与p2的值交换
   {
      p=p1;p1=p2;p2=p; //将p1的指向与p2的指向交换
   }
   cout<<"a="<<a<<" b="<<b<<endl;
   cout<<"max="<<*p1<<" min="<<*p2<<endl;
   return 0;
}

  上面的例子就是的关键在于交换指针的地址,因为指针p1指向了a,p2指向了b,如果交换地址,就是p1指向b,p2指向a,说得更简单一点就是和p1=&b;p2=&a;的作用一样了。

  如果还不太懂,下面一张图可以给你解释,即交换了指向的地址。

 


__EOF__

作  者ღKawaii
出  处https://www.cnblogs.com/kmsfan/p/4299635.html
关于博主:一个普通的小码农,为了梦想奋斗
版权声明:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!

posted @   yangliwen  阅读(483)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
0
0
关注
跳至底部
document.getElementById("homeTopTitle").innerText="ღKawaii";
点击右上角即可分享
微信分享提示