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

本文详细介绍了32位编译环境下各种数据类型的字节数、取值范围及数值溢出的情况,包括布尔型、字符型、整型等,并通过具体示例解析数值在内存中的存储方式。

以下讨论皆在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

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



### 整数类型 - **`byte`**:通常是 8 位无符号整数,占用 1 个字节的内存空间,取范围是 0 到 255。常用于对内存使用要求较高且数范围较小的场景,比如存储像素等。 ```csharp byte myByte = 127; ``` - **`short`**:16 位有符号整数,占用 2 个字节,取范围是 -32,768 到 32,767。适用于数范围不大,又需要比 `byte` 表示范围更大的情况。 ```csharp short myShort = -1000; ``` - **`int`**:32 位有符号整数,占用 4 个字节,取范围是 -2,147,483,648 到 2,147,483,647。是编程中最常用的整数类型,一般整数计算场景都可以使用。 ```csharp int myInt = 206265; ``` - **`long`**:64 位有符号整数,占用 8 个字节,取范围是 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。用于表示非常大的整数,如时间戳等。 ```csharp long myLong = 1234567890123L; ``` ### 浮点类型 - **`float`**:单精度浮点型,占用 4 个字节,可表示大约 7 位有效数字,能表示的数范围约为 ±1.5 x 10^-45 到 ±3.4 x 10^38。适合对精度要求不高的科学计算等场景。 ```csharp float myFloat = 3.14159f; ``` - **`double`**:双精度浮点型,占用 8 个字节,可表示大约 15 到 16 位有效数字,数范围约为 ±5.0 x 10^-324 到 ±1.7 x 10^308。精度比 `float` 高,在大多数需要浮点运算的场景中使用。 ```csharp double myDouble = 3.1415926535; ``` ### 小数类型 - **`decimal`**:用于精确的十进制计算,占用 16 个字节,具有 28 到 29 位有效数字。常用于金融计算等对精度要求极高的场景。 ```csharp decimal myDecimal = 123.45m; ``` ### 布尔类型 - **`bool`**:只有两个 `true` 和 `false`,占用 1 个字节。主要用于逻辑判断。 ```csharp bool isTrue = true; ``` ### 字符类型 - **`char`**:表示一个 Unicode 字符,占用 2 个字节。用于存储单个字符。 ```csharp char myChar = 'A'; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值