long多少位,long多少位数字

摘要:C语言的基本数据类型,大家从学生时代就开始学习了,但是又有多少人会试图从底层的角度去学习呢?这篇文章会用一问一答的形式,慢慢解析相关的内容和困惑。本文分享自华为云社区《》,作者:breakDaw

摘要:C语言的基本数据类型,大家从学生时代就开始学习了,但是又有多少人会试图从底层的角度去学习呢?这篇文章会用一问一答的形式,慢慢解析相关的内容和困惑。

本文分享自华为云社区《》,作者: breakDawn 。

C语言的基本数据类型,大家从学生时代就开始学习了,但是又有多少人会试图从底层的角度去学习呢?这篇文章会用一问一答的形式,慢慢解析相关的内容和困惑。

数据类型位数和符号

数据类型转换

浮点数

数据类型位数和符号

问:C里的签名和unsigned类型的区别是什么?

A:拿unsigned char无符号char 和 signed char有符号char举例(因为他们都是1字节,比较好举例子)

假设某个局部变量a,内存里存的都是0xff(即二进制11111111)

执行printf(“%d”,a)时, 输出的是255,还是-1呢?

如果a是无符号,那就是255。

如果a是有符号,那就是-1。

Q:为什么有符号的0xff输出的是-1?

1、在32位系统中:char(1)字节 short(2)字节 int(2)字节 long(4)字节 char*(4)字节 int*(4)字节 int**(4)字节 2、在64位系统中:char(1)字节 short(2)字节 int(4)字节 long(8)字节 char*。

A:这个就是补码的概念。

正数的补码就是其本身

负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1.(即在反码的基础上+1)

补码的计算方式:如果是-1,则负号就是首位的&34;, 而&34;里的1作为二进制是0000001,取反+1,得到1111111, 和首位1拼接,变成了11111111.

进行printf打印时,long多少位数字,C语言通过变量类型,确认11111111的首位是符号位,于是通过补码的反向计算,得到实际真值为-1。

原码、反码、补码对于+1和-1的表示如下

[+1] = [00000001]原 = [00000001]反 = [00000001]补

[-1] = [10000001]原 = [11111110]反 = [11111111]补

A:计算机CPU做计算时,无法区别符号位,只会死板的将8位数字进行加法计算。

假设做减法,就和下面那样

可以看到符号位的信息会误导减法的计算。

Q: 那为什么不用能反码呢

A:因为反码对于0的表示有两种情况,11111111可以代表-0,而00000000代表+0,相当于浪费了。

而补码不存在这个情况。11111111代表-1,00000000代表0。

Q: 为什么要有补码?补码有什么好处?

long long 为64位整数类型,一般的long long为64位,由于负数补码的原因,第一位作为符号位,因此有63位可用。则取值范围为-2^63到2^63-1 取2^10约等于1000多一点,则大概为9x10^18这么多,9后面18个0,建议大大于。

A:当计算机执行1 - 1时, 希望都是用加法的动作来做,且不希望做if-else判断,根据符号位去判断正负再做加减,对计算机的消耗是很大的。

使用补码的机制,则可以将1-1转成变成1+(-1)

那么-1就是补码0xff,和0x01相加,变成了0,即不需要做真正的减法即可

Q: 刚才提到CPU希望都是位加法,不肯做减法,为什么?

A:因为CPU的减、乘、除都是基于加法、移位等操作实现的。

加法过程依赖CPU的ALU累加器,累加器背后的电路是数字电路异或门和与门的组合。

char 固定一字节 8位。int 在16位下2字节,16位;32和64位下,4字节 32位。long 在16位和32位下,4字节32位。64位下8字节64位。以上xx位下指的是编译器。

Q: 为什么补码表示的情况下,范围是-128到127?为什么补码会比原码和反码多一位?

A:就是上面提到的0的问题。原码的10000000、00000000都表示0,补码的11111111和00000000都表示0,而补码只有1个0的表示

同时补码有一个100000000, 把后7位取反+1,等同于-128。

原码、反码、补码知识详细讲解(此作者是我找到的讲的最细最明白的一个)

Q: 计算机在CPU做计算时,怎么识别是无符号还是有符号?

A:CPU 所处理的寄存器、内存中的数本身无符号信息。CPU 做加减法时会一起做无符号数的进位/有符号数的溢出标志,并不专门对待有符号数和无符号数。

即CPU处理时,统一用加法处理,但是否要做求补等操作,取决于提供的运算指令。

在无符号中,long的表示数的范围为::0~

问:C语言的char是签名 char还是unsigned char?

一个:

当你定义为char时, 可能是signed char,也可能是unsigned char。

这个取决于你编译器的实现。

-fun 签名字符 : 设置为未签名字符

-fno-signed-char : 设置为 非签名字符

-签名字符 : 设置为签名字符

-fno-unsigned-char : 设置为 非无符号字符

Q: int有可能像char一样,即可能是signed int也可能是unsigned int吗?

A:int一定是有符号int。不会因为编译器不同而不同。

Q: 为什么char可以区分有符号或者无符号,但是int只能默认为signed int ?

A:个人理解和应用场景有关,char不一定会参与计算,而int大部分情况下都是有符号计算,因此默认为signed int比较好。

问:ILP32、LP64、LLP64分别是什么?

A:指的是这个操作系统中,有哪些类型分别是多少位的意思。

我指林特

L指龙

LL指龙长

P指点指针

32和64就是分别指32位和64位。

Q: 为什么windos要用LLP64这么奇怪的模型?这个模型里, long是32位,long long 才是64位。

A:来自知乎陈硕大佬的回答:

我猜,是因为 Windows API 从 16-bit 升级到 32-bit 发生得太晚了——大约是随 1995 年发布的 Windows 95 而普及 。

虽然之前有 Windows NT 3.x 和 Win32s,但似乎比较小众。

而 Unix 从 16 位 升级到 32-bit 发生在 1980 年前后,当时运行在 VAX 上的 Unix/32V 和 3BSD 都是 32-bit 的。

造成的结果是,两边的程序对 short/int/long 的长度形成了不同的习惯认知:

Unix 程序习惯了 int 是 32-bit,而 long 不一定只有 32-bit。Windows/DOS 习惯了 long 是 32-bit,而 int 有可能是 16-bit 或 32-bit,因为刚刚从 16-bit 升级上来嘛。

long多少位

当往 64-bit 升级的时候,如果把 Windows 的 long 升级到 64-bit,会破坏原来很多程序的假设。

只好用个新的类型来表示 64-bit 整数了。反正 LONGLONG 在 32-bit 程序中也是 64-bit 整数,干脆用它好了。

详细的数据类型展示:

Q: 那么又有个问题,java虚拟机如何实现不同平台可以跑相同的java代码,不用担心底层数据类型的?

A:如图所示,class字节码都是同一份,但是不同的系统,会有不同的虚拟机解释器实现,在解释器实现里处理了不同的数据类型位数情况。

数据类型转换

Q: C里的隐式类型转换有什么规律?

一个:

占用字节数少的类型,向占用字节数多的类型转换;

整>长

占用字节数相同情况下,有符号向无符号转换;

>未签名的int

整数类型向浮点类型转换;

整数 -> 双

单精度向双精度转换;

浮>加倍

Q: 下面这个例子输出多少,为什么?

一个:

void Test(){int a = -1;unsigned b = 10;if (a > b){printf(&34;);}else{printf(&34;);}}

输出>b即a 大于

因为a=-1,存储的二进制是11111111, 强转成unsigned时,二进制没有变,但是对编译器而言表示的大小变成了255了。

浮点数

float、double、long double的比特数、有效位数、数值范围如下:

问:下面这个代码输出什么?

34;a > b\n&34;a == b\n&34;a < b\n");}return 0;}

A:输出“a=b”, 因为float最多7位有效小数点位数。

Q: 32位float,1bit为符号位,23bit为位数,8bit为指数, 这3个划分是如何得到float的有效位数以及数值范围的?

A:IEEE754标准理解。

【计算机组成原理】IEEE754标准

有人问为什么要学习这个?

对于高精度场景下的浮点计算,掌握IEEE754的标准很重要,否则无法理解高精度场景时计算过程出现的各种问题, 特别是一些金融场景,对于小数点后面的数字会特别敏感。

Q:java的BigDecimal类可以表示任意精度,原理是啥?

A:BigDecimal的原理很简单,就是将小数扩大N倍,转成整数后再进行计算,同时结合指数,得出没有精度损失的结果。

以long型的intCompact和scale来存储精确的值。

上一篇 2023年03月29 08:38
下一篇 2023年04月12 22:12

相关推荐

  • 武老师是谁,武老师图片

    1月5日北京市朝阳区新冠病毒疫苗接种工作进入第五天这一天在朝阳区从事食品加工生产的武师傅和70多位同事一起来到临时接种点张瑜。《林深见鹿》电视剧是由臧溪川执导,任增超编剧,靳东、张瑜、李小冉、王泷正、

    2023年05月01 250
  • 乐怎么拼音,乐字六个读音的使用

    《清平乐》的“乐”为何要读“lè”宋仁宗坐像热播剧《清平乐》自播出以来,备受关注。其考究的服化、场景、台词等处处都能体现出制作团队对历史细节的尊重,非常难得。这样的大型历史剧对传播中国古典文化是深有裨

    2023年05月31 283
  • 1的算术平方根是多少,1的算术平方根的值

    虚数这个话题至今仍然带有些许神秘色彩.这完全要归咎与它糟糕的命名,如果我们把i与正向单位+1和负向单位-1一起被称作侧向单位而非虚数单位的话,这种神秘就不存在了.——CarlFriedrichGaus

    2023年02月20 255
  • 多少目是什么意思,4000目是什么意思

    日常烹饪当然少不了刀具,但是刀具在长时间使用后就会变钝,一般我们需要将刀具放在磨刀石上磨几下,就会变好一点。磨刀不仅仅可以用磨刀石,4000目是什么意思,还可以用磨刀器和磨刀棒,一般的磨刀石上都会标注

    2023年02月20 293
  • 比46多32的数是多少,比23的9倍多46的数是多少

    中华人民共和国2022年国民经济和社会发展统计公报[1]国家统计局46+32=782023年2月28日2022年是党和国家历史上极为重要的一年。党的二十大胜利召开,擘画了全面建设社会主义现代化国家、以

    2023年03月30 209
  • 六级相当于雅思多少分,六级刚过线雅思什么水平

    雅思7分属于良好水平,六级刚过线雅思什么水平,该分数阶段英语运用能力良好,对于复杂英语的理解能力也相当不错,偶尔会出现不准确的情况。该成绩已达到国外知名院校要求,申请国外院校毫无压力。那么雅思7分相当

    2023年03月18 295
  • 初三多少岁,初三是15岁还是16岁

    中国农历岁时表:岁时节令也就是岁时、岁事、时节、时令等事,是人们的社会生活中约定俗成的一种集体性习俗活动。中国画的题款除讲究诗情画意外,一般书年号一般用中国历干支(岁阳、岁阴)题款,至于季令,月令,时

    2023年03月08 274
  • 2017清华多少分录取,清华多少分录取2019

    官子钦在学校自学数学其实,录取超常儿童进入高校学习,在我国已有一定历史。中国科学技术大学于1978年率先创办了少年班。随后,上世纪80年代左右,北京大学、清华大学、西安交通大学等高校,都曾开办少年班,

    2023年04月03 219
  • 教师资格证多少分及格,为什么上半年教资容易过

    高中数学教师资格证备考经验分享考试内容:科一(综合素质)、科二(教育知识与能力)、科三(学科知识与教学能力)科一科二备考:1.资料:网上的教资重点2022年教师资格证考试合格分数线为70分,达到70分

    2023年02月18 224
  • 全年事假不超过多少天,所有事假一年不超过15天

    作为一名HR,你了解关于假期的25种规定与待遇吗?小编整理了2022最新版关于假期的25类规定和待遇,HR赶紧转发收藏~本文汇总的25类假期如下,大家可以划到自己感兴趣的部分查看:1.休息日2.法定节

    2023年03月18 286
  • 视频剪辑培训大概多少钱

    常常看到有说1块就能学习视频是非常不靠谱的行为了,视频剪辑课内容很多,课程也非常的巨大繁琐,1块钱是不可能给你这么多的优惠的。1元只是试听课,这个已经算是公开的秘密了。都是打广告的,是商家们为了宣传广

    2023年03月20 275
  • 电大专科学费多少,电大大专学费

    国家开放大学学费总共多少钱?近期不少小伙伴问道!往下看!殷老师来科普!一、国家开放大学学费每学期学费2000元左右。在上海电大读大专用不了多少钱,据了解一共两年半毕业,合计学费一万左右。电大大专学费,

    2023年02月23 246
  • 中国有多少条法律,民法典是不是包括所有法律

    中华人民共和国立法法目录第一章总则第二章法律第一节立法权限第二节全国人民代表大会立法程序第三节全国人民代表大会常务委员会立法程序第四节法律解释第五节其他规定第三章行政法规第四章地方性法规、自治条例和单

    2023年04月09 301
关注微信