C++bool,char,int,long,float,double取值范围以及存储形式

计算机由逻辑电路组成,而逻辑电路通常只有两种状态,即开关的断开与接通,刚好可以表示成 0 和 1,所以计算机只能存储二进制数据。为了设计简单,计算机只设计了加法寄存器,计算机只能进行加法操作,通过补码的形式可以将减法转换为加法操作,所以数据在计算机内存中是以 补码的形式存储的

一、C++基本数据类型

以下是在64位计算机中,g++编译器,x86_64构架下测试

类型

字节数

取值范围

bool

1

false(0) , true(1)

char(signed char)

1

-(2^7) 到 (2^7)-1

unsigned char

1

0 到 (2^8)-1

short(signed short)

2

-(2^15) 到 (2^15)-1

short int(signed short int)

2

-(2^15) 到 (2^15)-1

unsigned short(unsigned short int)

2

0 到 (2^16)-1

int(signed int)

4

-(2^31) 到 (2^31)-1

unsigned int

4

0 到 (2^32)-1

long(signed long)

8

-(2^63) 到 (2^63)-1

unsigned long

8

0 到 (2^64)-1

long int(signed long int)

8

-(2^31) 到 (2^31)-1

unsigned long int

8

0 到 (2^64)-1

long long(signed long long)

8

-(2^31) 到 (2^31)-1

unsigned long long

8

0 到 (2^64)-1

float

4

1.175494351e-38F 到 3.402823466e+38F

double

8

2.22507e-308 到 1.79769e+308

long double

16

2.22507e-308 到 1.79769e+308

data_type.cpp
#include <iostream>
#include <float.h>
#include <limits.h>
using namespace std;

int main(int argc, char *argv[])
{
    cout << "bool = " << sizeof(bool) << endl;
    cout << endl;

    cout << "char = " << sizeof(char) << endl;
    cout << "signed char = " << sizeof(signed char) << endl;
    cout << "SCHAR_MIN = " << SCHAR_MIN << endl;
    cout << "SCHAR_MAX = " << SCHAR_MAX << endl;
    cout << "unsigned char = " << sizeof(unsigned char) << endl;
    cout << "UCHAR_MAX = " << UCHAR_MAX << endl;
    cout << endl;

    cout << "short = " << sizeof(short) << endl;
    cout << "signed short = " << sizeof(signed short) << endl;
    cout << "short int = " << sizeof(short int) << endl;
    cout << "signed short int = " << sizeof(signed short int) << endl;
    cout << "SHRT_MIN = " << SHRT_MIN << endl;
    cout << "SHRT_MAX = " << SHRT_MAX << endl;
    cout << "unsigned short = " << sizeof(unsigned short) << endl;
    cout << "unsigned short int = " << sizeof(unsigned short int) << endl;
    cout << "USHRT_MAX = " << USHRT_MAX << endl;
    cout << endl;

    cout << "int = " << sizeof(int) << endl;
    cout << "signed int = " << sizeof(signed int) << endl;
    cout << "INT_MIN = " << INT_MIN << endl;
    cout << "INT_MAX = " << INT_MAX << endl;
    cout << "unsigned int = " << sizeof(unsigned int) << endl;
    cout << "UINT_MAX = " << UINT_MAX << endl;
    cout << endl;

    cout << "long = " << sizeof(long) << endl;
    cout << "signed long = " << sizeof(signed long) << endl;
    cout << "LONG_MIN = " << LONG_MIN << endl;
    cout << "LONG_MAX = " << LONG_MAX << endl;
    cout << "unsigned long = " << sizeof(unsigned long) << endl;
    cout << "ULONG_MAX = " << ULONG_MAX << endl;
    cout << endl;

    cout << "long int = " << sizeof(long int) << endl;
    cout << "signed long int = " << sizeof(signed long int) << endl;
    cout << "unsigned long int = " << sizeof(unsigned long int) << endl;
    cout << endl;

    cout << "long long = " << sizeof(long long) << endl;
    cout << "signed long long = " << sizeof(signed long long) << endl;
    cout << "LLONG_MIN = " << LLONG_MIN << endl;
    cout << "LLONG_MAX = " << LLONG_MAX << endl;
    cout << "unsigned long long = " << sizeof(unsigned long long) << endl;
    cout << "ULLONG_MAX = " << ULLONG_MAX << endl;
    cout << endl;

    cout << "float = " << sizeof(float) << endl;
    cout << "FLT_MIN = " << FLT_MIN << endl;
    cout << "FLT_MAX = " << FLT_MAX << endl;    
    cout << endl;

    cout << "double = " << sizeof(double) << endl;
    cout << "DBL_MIN = " << DBL_MIN << endl;
    cout << "DBL_MAX = " << DBL_MAX << endl;    
    cout << endl;

    cout << "long double = " << sizeof(long double) << endl;
    cout << "LDBL_MIN = " << DBL_MIN << endl;
    cout << "LDBL_MAX = " << DBL_MAX << endl;    
    cout << endl;

    return 0;
}
bool = 1

char = 1
signed char = 1
SCHAR_MIN = -128
SCHAR_MAX = 127
unsigned char = 1
UCHAR_MAX = 255

short = 2
signed short = 2
short int = 2
signed short int = 2
SHRT_MIN = -32768
SHRT_MAX = 32767
unsigned short = 2
unsigned short int = 2
USHRT_MAX = 65535

int = 4
signed int = 4
INT_MIN = -2147483648
INT_MAX = 2147483647
unsigned int = 4
UINT_MAX = 4294967295

long = 8
signed long = 8
LONG_MIN = -9223372036854775808
LONG_MAX = 9223372036854775807
unsigned long = 8
ULONG_MAX = 18446744073709551615

long int = 8
signed long int = 8
unsigned long int = 8

long long = 8
signed long long = 8
LLONG_MIN = -9223372036854775808
LLONG_MAX = 9223372036854775807
unsigned long long = 8
ULLONG_MAX = 18446744073709551615

float = 4
FLT_MIN = 1.17549e-38
FLT_MAX = 3.40282e+38

double = 8
DBL_MIN = 2.22507e-308
DBL_MAX = 1.79769e+308

long double = 16
LDBL_MIN = 2.22507e-308
LDBL_MAX = 1.79769e+308

C++中,bool类型的取值是这么定义的

enum {
    false    = 0,
    true    = 1
};
data_type.cpp
#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{
    bool b = false;
    cout << "b = " << b << endl;
    b = true;
    cout << "b = " << b << endl;
    cout << "sizeof(bool) = " << sizeof(bool) << endl;

    return 0;
}

二、计算机基础知识

机器数

机器数就是数据在计算机中的二进制表示形式。机器数是带符号的,在计算机中用二进制数的最高位存放符号, 正数为0, 负数为1。

例如:32位计算机中,十进制数

5 的二进制表示形式(机器数)为:00000000,00000000,00000000,00000111
-5 的二进制表示形式(机器数)为:10000000,00000000,00000000,00000111

真值

真值就是真正的值。将带符号位的机器数对应的真正数值称为机器数的真值即最高位用 ± 表示数字的正负,其余为二进制数。

例如:32位计算机中,十进制数

5 的真值为:+0000000,00000000,00000000,00000111
-5 的真值为:-0000000,00000000,00000000,00000111

原码

原码就是机器数,即用最高位存放符号, 正数为0, 负数为1。, 其余位表示值。

例如:32位计算机中,十进制数

5 的原码为:00000000,00000000,00000000,00000111
-5 的原码为:10000000,00000000,00000000,00000111

反码

正数的反码就是它的原码

负数的反码是在其原码的基础上, 符号位不变,其余各个位取反

例如:32位计算机中,十进制数

5 的反码为:00000000,00000000,00000000,00000111
-5 的反码为:11111111,11111111,11111111,11111000

补码

正数的补码就是它的原码

负数的补码是它的反码加1

例如:32位计算机中,十进制数

5 的反码为:00000000,00000000,00000000,00000111
-5 的反码为:11111111,11111111,11111111,11111001

三、总结

  • C++基本数据类型包括bool、char、int、long、float、double、long double等。数据在计算机内存中是以补码的形式存储的。

  • 机器数就是数据在计算机中的二进制表示形式。机器数是带符号的,在计算机中用二进制数的最高位存放符号, 正数为0, 负数为1。原码就是机器数,即用最高位存放符号, 正数为0, 负数为1。, 其余位表示值。正数的反码就是它的原码,负数的反码是在其原码的基础上, 符号位不变,其余各个位取反。正数的补码就是它的原码,负数的补码是它的反码加1。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值