第二章 变量和基本类型——2.1 基本内置类型

2.1 基本内置类型


闲话少叙,先把基本的内置类型列举出来:

类型含义最小存储空间整型/浮点型
bool布尔型——整型
char字符型8位整型
wchar_t宽字符型16位整型
short短整型16位整型
int整型16位整型
long长整型32位整型
float单精度浮点型6位有效数字浮点型
double双精度浮点型10位有效数字浮点型
long double扩展精度浮点型10位有效数字浮点型

Tips:

  • 虽然C++标准规定了每一种算数类型的最小存储空间,但并不能组织编译器使用更大的存储空间。以int为例,几乎所有的编译器使用的存储空间都比16位要大。

  • 8位的块为一个字节32位4个字节为一个“字”。只有在知道相应内存地址对应的字节或字所表示的算术类型后,才能确定其真正表示的含义。例如:内存地址为736425的字节01110001,如果我们知道其算术类型为8位无符号整数,那么其代表了整数112;若其代表了ISO-Latin-1中的一个字符,那么其代表了小写字母q

  • bool以外,其他整型类型均可分为signed(带符号的)和unsigned(不带符号的)。intshortlong默认为signed; 为使用unsigned类型必须先声明,如unsigned longunsigned int可简化表示为unsigned

  • 对于整型赋值这件事来说,当声明的数据类型为unsigned的时候,需要对超出范围的(如336)和负数的值(如-1)取模,在进行赋值。首先,针对8位unsigned char, 那么336%256 = 1 * 256 + 8080为最终的模数;而对于-1 % 256 = -1 * 256 + 255,则255为最终的模数。

Postscript:

可能你也会跟我一样,被上面的求模给折腾个够呛。经过一番搜索与探寻,我们从原理上来探究一下这个问题。

首先,我们先来看看C++中在内存里是通过什么形式来存储数据的。这里我们抛出三个概念:原码、反码、补码。《第二章 变量和基本类型——2.1 基本内置类型((转)附录之原码、反码和补码及其背后的数学之美)》

  • 原码 简单来说就是真真正正表示具体数值的码,最高位为符号位,其余各位表示二进制数值。如1表示为0000 0001; -3表示为1000 0011。用原码是没法直接来解决上述正数加负数问题的,所以伟大的计算机科学家们就开动了脑筋,创造了反码和补码这一神器的东西。

  • 反码 为了简化计算机的运算方式,用加法替代减法(1-1 = 1+(-1) = 0),所以出现了反码。反码的概念是通过求模同余思想发展而来的。通过求反如5表示为0000 0101(正数的反码为本身); -3表示为1111 1100(负数的反码为除去符号位求反),使用反码进行相加得到的反码为0000 0001, 注意①,这里出现了进位,需要在求得反码和的基础上加上进位1,从而求得最终的反码0000 0010注意②,针对得到的最终反码和,还需要恢复成原码才能正确表示其真值,对于上述结果0000 0010,首位为0,其为正数,则反码与原码相同;若首位为1,则要将其余各位取反,方可得到最终正确的原码。

  • 补码 顾名思义,就是要补一下反码的缺陷吧,我是这么觉得的,不过更深层的数学解释是将模增加1!这背后伟大的数学原理还请大家详见本节补充内容之《第二章 变量和基本类型——2.1 基本内置类型((转)附录之原码、反码和补码及其背后的数学之美)》。使用补码进行求和,正数的补码为本身,负数的补码需先将原码转换成反码在加15的补码表示为0000 0101; -3的补码表示为1111 1101,使用补码进行相加得到的补码和为0000 0010, 注意,针对得到的最终补码和,还需要恢复成原码才能正确表示其真值,对于上述结果0000 0010,首位为0,其为正数,则反码与原码相同;若首位为1,则要将其余各位取反,方可得到最终正确的原码。

通过以上的阐述我们明白了在计算机的内存中到底是以什么形式存储数据的,没错,就是补码 。那我们知道-1的补码为1111 1111,所以当我们将-1赋值给unsigned变量时,左手边第一位符号位变成了数字位,所以最终的结果将会变成255

综上所述,当把超出范围的数值(正数或者负数)赋给unsigned变量时,编译器会调整越界值使其满足要求,编译器会自动将该值对unsigned类型的取值数目进行求模,然后取所得值;当把超出范围的数值(正数或者负数)赋给signed变量时,也不会报错,但是最后的取值却与编译器有关,不同的编译器可能会采取不同的处理方法,但是大多数的编译器依然是采取和unsigned类型一样的处理方法,也就是对该类型的取值数目求模后的值。但是这中做法不能得到保证。具体的示例可以参考《第二章 变量和基本类型——2.1 基本内置类型((转)附录之C++中整型的超范围赋值问题)》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值