有符号整型,运算,bool与浮点数

signed与unsigned

用int来作为例子,int在64位机器上是32位的

signed int把最前面一位留作符号位,1代表负数,0代表正数,所以signed int的实际长度只有31位,能表示的范围是\([-2^{31}, 2^{31}-1]\)

注意当符号位为1时,要取补码处理。当signed int的实际内容为1000...0000,此时代表的是最小的int,即\(-2^{31}\),1111...1111代表的是-1,0000...0000代表的就是0,

运算

C++中,基本算数的最小单位是int,比int更小的数据类型会被转换成int再进行计算。

当signed类型出现overflow,比如

signed int number = 128;
cout << (number+1) << endl;
output: -127

本质上是二进制数上的符号位进位,从0变成了1,负数再取补码,便得到了这样的结果

bool

bool是C++新加入的特性,C中并不存在

bool和带符号整形可以互相转换,值得注意的是,只有0代表false,其他都代表true

C++的最小内存单位是字节,所以一个bool变量就会用到一个字节,并不是一个bit

浮点数

浮点数是我们用来存储实数的数据类型,分为单精度和双精度
当一个小数没有用后缀标记,默认为double,f后缀为float,l后缀为long double

一个单精度浮点数在内存中的存储结构如下,有1位符号位,8位指数位和23位尾数位

sign在java是什么意思 sign int_浮点数

浮点数的存储结构决定了一个浮点数只能在有限范围内取值,取得值是有限的,但实数有无限个,所以很多实数我们只能用最靠近它的浮点数来表示,这也就是“浮点数表示不准”的原因。我们在对浮点数进行比较时,一定要用FLT_EPSILON这个宏。但有一点可以保证,那就是浮点数可以准确地表示0

指数部分被称为阶码,浮点数存储中阶码会在原本基础上加上01111111(二进制),这个加上的值被称为偏移值,得到的结果被称为移码,以保证阶码一定为正,因为浮点数中阶码没有符号位

\(2.0f / 0.0f\) 得到的结果是inf,inf的指数部分是11111111,尾数部分为0
\(0.0f / 0.0f\)