基本数据类型

让我们复习一下C语言中基本数据类型的内存占用(单位为字节):


这其实是很基础的知识,但是值得一提的是,表中只有两个数据类型在32位和64位计算机中使用了不同的字节数,一个是long int,另一个是char *。其实不只是char *,任何数据类型的指针使用的字节数都和char *是一样的,所以这里更好的写法应该是type *

为了尽量使程序可移植,要小心从32位到64位的变化。例如,在32位机器中使用int保存变量的地址可行,但同样的程序移植到64位机器中就成了bug。所以不如尝试用long int保存变量的地址。这个时候,上面的表格就体现出了它的价值。

大小端模式

对于多于一个字节的数据类型,在内存中有两种存储方式,以整型数0x01234567为例


大端模式将高位存放在低地址,而小端模式将高位存放在高地址。这对我们编程有什么影响呢?说实话,在我写过的程序中并没考虑过大小端模式,但在如下几个方面,可以体现出大小端模式的影响。

大端机器与小端机器间的网络通信。

很明显,如果双方都遵循先发低位再发高位的规则,发送前后数据在内存中的存储方式是完全一致的,但大端机器和小端机器对同样的数据存储方式却会解析出完全不同的结果,导致数据出错。因此,解决办法是发送前全部转换成大端模式,对方接收后,再根据自己的机器类型转换成大端或小端模式。实际中网络通信也的确是这样做的。

汇编可以看到真实数据顺序。

比如

add %eax, 0x8049464

经过汇编后得到的机器码是

80483bd: 01 05 64 94 04 08

操作数0x8049464被转换成了小端模式下的结果64 94 04 08

绕开类型系统的强制转换。

如下代码可以测试出机器是大端模式还是小端模式:

int value = 0x01234567;char *ch = (char *)(&value);if (*ch == 0x01) {//大端模式} else if (*ch == 0x67) {//小端模式} else {//其它}

由于ch一定指向value最低地址的字节,因此可以通过ch来判断系统的大小端类型。

整型数范围与C标准

本文最开始就给出了各个基本数据类型的字节数,根据字节数我们可以推断出在采用二进制补码编码的情况下各个类型的表示范围。比如说int的范围为-2,147,483,648 ~ 2,147,483,647。但是C标准的存在却提醒我们事实并非总是如此。

C标准规定的各类型整型数的范围与其典型值有所不同,通常小于其典型值范围,并且所有有符号类型只要求对称范围。例如,int只要求-32767 ~ 32767。虽然我们使用的编译器会按照系统位数来决定int类型的实际范围,但是,如果想要使代码能够跨平台,最好按照C标准规定的范围来设计自己的程序,这样只要编译器遵循C标准,代码就一定不会出错。否则,像int i = 99999;这样的语句,放到16位计算机上就直接溢出了。

接下来提一个有趣的事情,在32位计算机的头文件中,定义了各个基本数据类型的范围,以整型为例

#define INT_MAX 2147483647#define INT_MIN (-INT_MAX-1)

为什么最小值不直接写#define INT_MIN -2147483648呢?

因为对编译器来说,-2147483648是一个表达式,它的意思是对2147483648取负。但是2147483648这个数已经超出了整型数所能表示的范围,因此这样写是没有意义的。更详细的解释可以查看后面的参考资料。

复合型类型转换——从short到unsigned

数据类型既有不同的范围,又有不同的符号性质,当两者同时转换时,就需要多加注意。

例如,从short转换到unsigned需要分两步,实际过程相当于(unsigned)(int),而不是(unsigned)(unsigned short)。也就是说,先扩大范围,再改变符号性质。对于下面的代码

short s = -12345;unsigned u = s;printf("%u\n", u);unsigned u1 = (unsigned)(int) s;printf("%u\n", u1);unsigned u2 = (unsigned)(unsigned short) s;printf("%u\n", u2);

打印结果uu1都是4294954951,而u253191

c++中有表示正无穷的数吗_阅读:贯穿编程人生CSAPP[2]信息表示相关推荐

  1. c++中有表示正无穷的数吗_简单的数

    数字可谓是数学系统中最基本的单元,它们所拥有的特性已经让数论家为之着迷了上千年.数字可被分为不同的类型,如自然数.整数等等,不同种类数字之间又各自有着一定的关联,并且有着一些与它们相关的数学问题. 平 ...

  2. 关于对数的有趣问题:lnx趋近于负无穷的速率与lnx趋近于正无穷的速率一样吗?对数的平方趋近于无穷的速率相当于x的几次方?

    关于对数的有趣问题:lnx趋近于负无穷的速率与lnx趋近于正无穷的速率一样吗?对数的平方趋近于无穷的速率相当于x的几次方? 在最近的科研中,我遇到了一个有趣又不是很容易的问题,我需要了解对数的平方趋近 ...

  3. 定积分求解(1)cos(bx)*e^(-x^2)在负无穷到正无穷的积分

    c o s b x ⋅ e − x 2 cosbx \cdot e^{-x^2} cosbx⋅e−x2 在负无穷到正无穷的积分 ∫ − ∞ ∞ c o s b x ⋅ e − x 2 d x \int ...

  4. 高数基础_第2节_序列极限

    高数基础_第2节_序列极限 序列 序列极限的定义 序列极限的性质和夹逼定理 序列极限的性质 夹逼定理 重要极限 等比数列和的极限 极限为 e 表达式 从上面e的推导,得出欧拉常数 无穷小量.无穷大量和 ...

  5. (1-cosx)/(x^2)从负无穷到正无穷的积分怎么求?

    2019独角兽企业重金招聘Python工程师标准>>> (1-cosx)/(x^2)从负无穷到正无穷的积分怎么求? 这道题需要先进行简单地变形,然后利用帕塞瓦尔定理,再计算结果. 1 ...

  6. python第四章答案猜数游戏_猜数游戏python

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 本文实例为大家分享了python实现猜数游戏的具体代码,供大家参考,具体内容如下 ...

  7. python两数相加代码_一边学编程,一边学语数外,用python编程全排列10以内两数加法...

    原标题:一边学编程,一边学语数外,用python编程全排列10以内两数加法 编程并不神秘 编程只是解决问题的一共方法 python是一门编程语言 python是一种解决问题的编程工具 在小学阶段,学习 ...

  8. python计算矩形周长_一边学编程,一边学语数外,用python编程学三年级周长计算...

    原标题:一边学编程,一边学语数外,用python编程学三年级周长计算 编程并不神秘 编程只是解决问题的一共方法 python是一门编程语言 python是一种解决问题的编程工具 在小学阶段,学习编程的 ...

  9. 模拟一个简单计算器_阅读模拟器的简单介绍

    模拟一个简单计算器 Read simulators are widely being used within the research community to create synthetic an ...

最新文章

  1. django-admin.py 不是内部或外部命令
  2. java程序中date类型比较大小总结
  3. Swoole的TCP/IP HTTP WebSocket关系
  4. 【Linux】scp“免密” 远程copy较多文件
  5. oracle内存锁,Oracle OCP之硬解析在共享池中获取内存锁的过程
  6. php动态获取函数参数
  7. 解决移动端touch事件与click冲突的问题
  8. 【ES】分布式调度系统之 Elastic-Job-Lite
  9. shell 除法 小数点
  10. java和c语言的区别_都说C语言不会过时,但你是否还需要掌握其他语言?
  11. Delphi2010正式版的代码格式化及自动完成
  12. 轻量却超强——推荐几款好用的截图工具(1) FScapture
  13. luogu1600天天爱跑步
  14. 转《胡侃学习(理论)计算机》的心得
  15. python是什么语言编写的程序称为_Python 学习(一)【Python语言简介-Python是什么】...
  16. Unity3d 周分享(17期 2019.5.18 )
  17. PNP与NPN两种三极管使用方法
  18. Python中ASCII转十六进制、C中BCD转十进制、十六进制学习记录
  19. [渝粤教育] 郑州轻工业大学 机械制图1 参考 资料
  20. 树状选择框测试用例_分类树测试用例设计工具:CTE XL

热门文章

  1. 混合文件下分离xml文件和jpg文件
  2. C#编程中的66个好习惯 值得收藏
  3. Spire.Doc 教程:用C#识别Word中的合并字段名称
  4. Laravel 5.2问题-----postman进api的post请求,为什么出现Forbidden?
  5. DNS高级部署使用RSYNC部署搭建DNS view主从服务
  6. Silverlight 1.0 RC SDK 预览
  7. Python中的ThreadLocal变量
  8. 关于UI Automation框架
  9. 又一编辑神器-百度编辑器-Ueditor
  10. 怎么用js调用C#后台方法