C++ bool,char,short,int,long,float,double数据类型大小以及数据溢出值求解

以下讨论皆在32位编译环境

类型 含义 字节数 取值范围

bool                        布尔型 1 0,1

char 字符型 1 [-2^7, 2^7-1] (2^7 = 128)

wchar_t 宽字符 2 [-2^15, 2^15-1] (2^15 = 32768)

short 短整型 2 [-2^15, 2^15-1] (2^15 = 32768)

int 整型 4 [-2^31,  2^31-1] (2^31 = 2147483648)

unsigned 无符号整型 4 [0, 2^32 - 1] (2^32 = 4294967296)

long 长整型 4 [-2^31,  2^31-1] (2^31 = 2147483648)

float 单精度 4 [1.17 * 10^-38, 3.4 * 10^38] (这里只是正数范围内,负数范围对称过去)

long long 长整型 8 [-2^63, 2^63-1] (2^63 = 9223372036854775808)

double 双精度 8 [2.225*10^-308, 1.797*10^308](这里只是正数范围内,负数范围对称过去)

小提示:float值一般能保证6位有效位数字,double一般保证10位有效数字


接着关于数据类型数值溢出情况的讨论:(以short类型为例)

short i = -32769;  // 内存中实际值是i = 32767,如何得到?

short字节数为2,每个字节长度8bit,所以一个short类型使用16bit表示,一个bit即一个二进制的值,所以-32769的二进制是 (1)1000 0000 0000 0001,因为是负数(符号位,即最高位为1), 负数在内存中以补码形式存储原码到补码只需原码取反,再加1。这里由于最高位除了作为符号位外,还参与了数值表示,所以在取反时,最高位同样取反,最终得到0111 1111 1111 1111,转化为十进制即为32767
short i = 32769; //内存中实际的值是 i = -32767,如何得到?
32769的二进制是1000 0000 0000 0001,由于最高位是1,表示为负数,即该码为某负数的补码, 补码到原码同样只需取反加1操作,取反时符号位保持不变,最终得到1111 1111 1111 1111,转化为十进制即为-32767

short i = 65537; //内存中实际值是i = 1,如何得到?
65537的二进制是 1 0000 0000 0000 0001,因为有一位超出了short的范围,超出的部分直接舍弃(从低往高存,存到16位就结束了,第17位完全没记录),所以内存中二进制是0000 0000 0000 0001,符号位为0, 正数在内存中以原码存储,转化为十进制是1
short i = -65537; // 内存中实际值是 i = -1,如何得到?
对于超出short位数范围的负数,先不管符号,按照正数来,得到它的二进制,超出部分直接舍弃,剩下的部分存入内存,同时加入符号位,所以最终二进制是1000 0000 0000 0001,转化为十进制是-1

(感觉还是有问题。。。。)



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值