int、short、long、long long是如何定义变量的
我们先从最为我们所知的定义变量入手,当我们用int定义一个变量的时候,这个变量是整型,长度是4个字节,不同的操作系统下由int定义的变量长度有可能不同,当然对于short、long、long long也是同样如此,因此为了使大家更清晰的了解本文内容,减少一些无关的疑问,我们有必要事先声明一下由这四个关键字,所定义的变量长度各自是多少。我用的是vs2019下的32位模式,如下图所示:
即:
关键字 | 变量的长度(字节) | 变量的长度(bit位) |
int | 4 | 32 |
short | 2 | 16 |
long | 4 | 32 |
long long | 8 | 64 |
不难知道,int a = 15表示:
- a是用int定义的变量,它的类型是整型
- a的值是15
接下来,我们看看int定义长度为4的整型变量的过程是什么样的?
我们用红色框所框起来的绿色区域,表示计算机内的整个内存区域,橙色表示由int a = 15所定义的变量,在内存中所占的区域。每个格子表示一个字节。当然了此图中红色框内的格子只有50个,内存不可能只有50个字节,这只是一种简化的表示。
int a = 15,实际上就是在整个内存区域中,划取一块长度为4个字节的连续区域,用来存放数字15,这段连续的区域名字是a。则short b = 14,实际上就是在整个内存区域中,划取一块长度为2个字节的连续区域,用来存放数字14,这段区域的名字是b。同理long和long long都是此原理。
可是计算机不是只认识二进制吗?15和14都是十进制的数啊,作为十进制数的15和14在内存中究竟是如何储存的呢?
其实岂止这一个问题,我们在心里肯定会想,既然计算机只认识二进制,那么我们的眼睛在显示屏幕上看到的十进制数15和14,又是怎么回事?停!停!停!我们的文章标题是:正负整数在内存中的存储本质,怎么扯到这里来了?!我要告诉大家的是,我们的眼睛在显示屏幕上看到的十进制数15和14是怎么回事,是与本文要研究的正负整数在内存中的存储本质,并不相关的一件事。然而对于初学者来说(初学者包括我),不解决我们的眼睛在显示屏幕上看到的十进制数15和14是怎么回事这个问题,它总会在我们思考其它问题的时候,给我们制造麻烦,尤其是思考本文研究的问题。别怕,在后文中我们会轻松的解决这件事。
注意此时我们知道了,int、short、long、long long是通过在内存中划取一块相应长度的区域来定义变量,这块区域的名字是变量名,这块区域中存放的数字就是变量的值。我们的疑问是,这个数字在这块内存中是如何储存的?我们通过回答以下几个问题,来一步步明晰并解决数字在内存中如何储存这件事。
这几个问题分别是:
- 计算机为什么只认识二进制
- 内存的由来
- 位、字节的由来
- 1byte = 8bit原因是什么
计算机为什么只认识二进制?
要搞清计算机为什么只认识二进制,我们大可不必把电脑的每个部件都拆下来,在显微镜里搞清楚每一个细节(当然作为初学者的我压根也没有这个能力)。也许,我们可以停下来,简单的想一下:二进制只有0和1,如果我没记错的话,在初中的物理课本中关于电学的某一个章节中,物理老师赋予了1和0两个不同的意义,它们是:
- 1表示开关闭合,即通电状态
- 0表示开关断开,即未通电状态
喔或!如果现在我说,计算机连0和1都不认识,它只能被动感受通电和未通电,大家应该可以理解。通电和未通电本身就是一种信息,这种信息只有两个情况:
- 一个情况是通电,我们用数字1表示
- 一个情况是断电,我们用数字0表示
至此,我们终于明白了计算机为什么只认识二进制,或者说为什么只认识0和1了吧!
内存的由来
那么计算机如何表示数字2的呢?
如果让你来设计计算机,你有什么好方法让只能感受通电和未通电的计算机来表示数字2呢?或者换句话说,你有什么好办法让本质上只认识0和1的计算机来认识数字2呢?
要想达到自己能够想办法来让计算机认识2的地步,你需要先了解以下,计算机如何来储存0和1。注意现在是,你已经明白了计算机如何认识或者说如何表示0和1,尚不知道计算机如何储存0和1?。
我不想一上来就介绍内存,cpu寄存器等之类的东西,然后告诉你,这些器件可以用来储存信息,亦或是做些别的事。因为,我们初学者大多数对于内存的理解,或者对于cpu的理解,仅仅限于听说过名字,眼睛看见过外观。这会让我们对其产生神秘感,进而给我们制造麻烦。所以请你先忘掉你仅仅只是了解皮毛,实则根本不懂的这些东西,不要让它影响了我们的思路。
那么你能试想一下,什么东西来储存0和1吗?
大概是一块能感受通电和断电的东西,如果想要表示1,就让这块东西通电好了;如果想要表示0就让这块东西断电好了;如果想要表示两个1,就搞两块这个东西,让这两块东西都通电好了;如果想要表示100个1就搞100块这个东西,让这100块东西都通电好了;如果想要表示100个1和100个0,就搞200个这东西,让100块通电,100块断电得了。然后我们把这块东西做的体积非常小,然后做很多很多个这种东西,最后把很多很多个这东西集成到一起,专门用来储存数据。通过图,我们来更直观的感受一下:如下图所示
每一个蓝色的格子就表示一块这种东西,红色框框住的区域表示很多个一块一块的这种东西集成到一起。我们把很多很多由这块东西个集成到一起组成的那个大东西,就叫做内存。你如果想要买这块大东西,你可以买那个叫做内存条的东西。
位、字节的由来
每一个蓝色格子所表示的那个仅能表示1个0或者1个1的小块东西,就是内存的最小存储单元。
假如你面前有一只羊,我问你羊的数量,你会回答:一只羊。
假如你面前有一条狗,我问你狗的数量,你会回答:一条狗
假如你面前有一块这个小东西,我问你这块小东西的数量,你应该回答:
1个位,英文表示为:1个bit
bit是什么意思?
- bit你可以认为就是那块小东西的名字
- 10个bit想给我们的传达的信息是:可以容纳10个二进制数字,就是说可以容纳的0和1的总数量是10个
- 想必你已经明白了我们用N个bit来表示,可以容纳的二进制信息的数量
这就是位(bit)的由来
一个鸡蛋50g,二十个鸡蛋的重量是1000g,也就是1kg
8个bit,也就是1字节(byte)。
即1byte = 8bit
1KB = 1024Byte
1MB = 1024KB
1GB = 1024MB
请耐心,本文的内核来了!
直接1kb = 1024bit不就得了,干嘛非要来个1byte = 8bit,然后1KB=1024Byte呢?
我们通常说的用来1MB的流量,指的就是用了1M个字节的流量,而不是1MBit。为什么bit最小的存储单元,而计算机中的基本存储单位却是byte(字节)呢?
1byte = 8bit原因是什么?(文章内核)
先看一下计算机如何来表示数字2?
我们知道,十进制的数字2,就是二进制的10,请看下表
十进制数字 | 对应的二进制数字 |
0 | 0 |
1 | 1 |
2 | 10 |
3 | 11 |
4 | 100 |
5 | 101 |
6 | 110 |
7 | 111 |
8 | 1000 |
9 | 1001 |
10 | 1010 |
11 | 1011 |
12 | 1100 |
既然2的二进制是10,那我们用两个bit,就是说用两个小块东西,一个放1,另一个放0不就可以表示了吗?从这里开始,我们不再提小块东西,而直接把它们叫做bit。
short、int等用来定义变量的原因
如果用两个bit,一个放1,一个放0来表示数字2,,那么如果我想表示1个苹果的个数1和0个香蕉的个数0时该怎么办呢?也是用两个bit,一个放苹果的个数1,另一个放香蕉的个数0吗?这样一来,10到底是1和0呢,还是表示2呢?
请看下图:
你很容易就看出来,三位数345,和个位数3、4、5了。我们把8个bit位看成一个整体,也就是1个byte字节。那么数字1,就是0000 0001,数字0,就是0000 0000。十进制2的二进制是10,如果一个bit位,就是单独的,与别的bit位不发生任何联系,那么二进制10就是1个1和1个0;如果把两个二进制位看做一个整体,10就是表示2;如果把三个二进制位看做一个整体,10会以010的方式呈现,此时还是表示2;如果把四个二进制位看做一个整体,此时还是表示2。
二进制1111 1111 表示十进制的255,是一个字节所能表示的最大的数字,而十进制300的二进制是1 0010 1100需要9个bit位,该如何表示呢?
不存在把9个bit位看做一个整体,计算机的最小存储单位是bit,而基本存储单位是byte字节。也就是说要想存储一个数,你要么用1个字节长度去存储,要么2两个字节长度去存储,要么用4个字节去存储等。用两个字节长度去存储,就是把16个二进制位看做一个整体,用4个字节长度去存储,就是把32个bit位看做是一个整体。于是300需要用2个字节去存储,二进制表示为:0000 0001 0010 1100。
通过两个例子,我们来强化理解一下这个思想。
例子一:
0010 0011 0010 0000 0010 0010 0010 0010 如何看待这个32位的数?
如果是short定义的变量,则需要定义两个变量才能达到32位,则一个变量值是前16位: 0010 0011 0010 0000(二进制),即十进制8992;另一个变量值是后16位:0010 0010 0010 0010 (二进制),即十进制8738。
如果是int定义的变量,则这个32位数整体就是变量值,即十进制589308450。
例子二:
20位数 1010 1111 0000 0000 1111如何放到内存中?
很简单 用int定义一个变量,把这个20位数赋给这个变量就可以了。然后这个变量就会在内存中划取一块长度为4个字节,即32bit位的空间,把这个20位的二进制数放入内存。它将会长这个样子:0000 0000 0000 1010 1111 0000 0000 1111。这个32个bit位,就是一个整体区域,要整体的看待。
这就是为什么有了字节,为什么有了short、int、long等来定义数据。
写的太累了,不想写了
标签:存储,字节,0010,二进制,int,正负,内存,bit From: https://blog.csdn.net/2301_81570594/article/details/143252857