c++ 基础数据类型

本文深入介绍了C++中的整型类型,包括有符号和无符号整型的字节数、取值范围,并通过示例解释了溢出情况。此外,还讲解了字符型,特别是宽字符和特殊字符的表示。同时,文章详细讨论了浮点型,如float、double和long double的精度和存储方式,以及浮点数的转换和输出。最后,提到了浮点型在内存中的表示和浮点数的科学计数法表示。
摘要由CSDN通过智能技术生成

1. 整型

有符号整型
类型字节数最大值最小值
short162^15 -1 (32767)-2^15(-32768)
int322^31 -1-2^31
long32位系统: long = int , 32; 64位系统: 6432位系统: 2^31 -1; 64位系统: 2^63 -132位系统:- 2^31; 64位系统: -2^63
long long642^63-1-2^63
无符号整型
类型字节数最大值最小值
short162^16-10
int322^32-10
long32位系统: long = int , 32; 64位系统: 6432位系统: 2^32-1; 64位系统: 2^64-10
long long642^64-10

示例:
1000000000000001 有符号: -1 无符号: 32769

代码获取字节数, 最大最小值
	cout << "short size:" << sizeof(short) << endl;
    cout << "int size:" << sizeof(int) << endl;
    cout << "long size:" << sizeof(long) << endl;
    cout << "long long size:" << sizeof(long long) << endl;
    
	cout << INT_MAX << endl;
    cout << UINT_MAX << endl;
    cout << ULONG_LONG_MAX << endl;
溢出
	int value1 = INT_MAX + 1;   
	// 01111111111111111111111111111111 + 1 = 10000000000000000000000000000000 =  -0,
	// 计算器默认赋值为INT_MIN = -2147483648
    unsigned int value2 = UINT_MAX + 1;   
    // 11111111111111111111111111111111 + 1 = 100000000000000000000000000000000 = 0,33位,取32位为0
	
	int value1 = INT_MAX + 2;   
	// 10000000000000000000000000000000 + 1 = 10000000000000000000000000000001 =  -1,
	// 计算器存储负数使用补码(符号位不变, 0->1, 1->0,再加1)
	// 10000000000000000000000000000000  补码: 
	// 11111111111111111111111111111111 + 1 = 10000000000000000000000000000000 = INT_MIN = -2147483648
	// -2147483648 + 1 = -2147483647
    unsigned int value2 = UINT_MAX + 2;   
    // 100000000000000000000000000000000 + 1 = 100000000000000000000000000000001 = 1,33位,取32位为1

2. 字符型

char
	cout << "请输入一个字符:";
    cin >> c;
    // 输出为ASCII码
    cout << "已经接收到的字符:" << c << endl; // 输入字符会输出字符,输入整数会输出数字
    // 输出为字符,put方法用于向控制台输出字符,即使参数值类型是整数,也会按ASCII输出字符
    cout.put(c);

char分为有符号和无符号类型
有符号取值范围为:-2^7 — 2^7-1    [-128, 127]
无符号取值范围为:-0— 2^8-1     [0, 255]

宽字符
类型字节数赋值前缀
wchar_t32L
char16_t  (c++ 11)16u
char32_t  (c++ 11)32U
    char c = 'a';
    wchar_t c1 = L'a';
    char16_t c2 = u'a';
    char32_t c3 = U'a';
    
    cout << c << endl;  // 输出a
    wcout << c1 << endl; // 输出a
  
    char16_t cc = u'中';
    cout << cc << endl; // 输出 20013
    cout << "\u4E2D" << endl; //转为16进制输出 中
    // char16_t 转为 wchar_t
    wcout << (wchar_t)c2 << endl; // 输出a
特殊字符

0 - 9  0:48
a - z  a:97
A -Z  A:65
\n:NewLine
\t:tab(水平)
\v:tab(垂直)
\b:backspace
\a:alert 输出警告音
\:输出“\”
\’:输出单引号
\":输出双引号

	cout << argv[0] << endl;
    cout << (char)7 << "你的姓名是什么?\n";
    cout << "请输入你的姓名:________\b\b\b\b\b\b\b\b";
    string name;
    cin >> name;
    cout << "\a你的姓名是:" << name << endl;

运行结果:


3. 布尔

ANSI/ISO C++ Standard 加入了bool类型

	bool flag1 = true;
    bool flag2 = false;
    if(flag1 == true && flag2 == false)
    {
        cout << "条件满足" << endl;
    }
    //  0:false  非0:true
    bool value1 = 100;
    bool value2 = 0;
    if(value1 && !value2)
    {
        cout << "value1等于true,value2等于false" << endl;
    }

4. 浮点型

类型字节数取值范围(十进制)精度
单精度浮点类型:float4 sizeof(float)-37 ~ +386到7位
双精度浮点类型:double8 sizeof(double)-307 ~ 30815到16位
长双精度浮点类型:long double16 sizeof(long double)-4931 ~ 493218到19

精度是由尾数位决定的。浮点数在内存中是按照科学计数法来存储的,其整数部分始终是一个隐藏着的1。由于他是不变的,因此对精度不会造成影响
float 尾数为23位, 2^23 = 8,388,608, 7位数,并不是所有七位数都可以表示,所以精度为6到7位
double 尾数为52位, 2^52 = 4,503,599,627,370,496, 16位数

代码获取取值范围和精度

#include <cfloat>

    int f_max = FLT_MAX_10_EXP;
    int d_max = DBL_MAX_10_EXP;
    int ld_max = LDBL_MAX_10_EXP;
    
    int f_dig = FLT_DIG;  // 6
    int d_dig = DBL_DIG;  // 15
    int ld_dig = LDBL_DIG; // 18
十进制浮点数转换为二进制浮点数

十进制整数转换为二进制整数

// 将十进制整数转为二进制整数
    bitset<32> myset(443);
    cout << myset << endl;

十进制浮点数转为二进制浮点数
示例:20.5

20 -> 10100
小数位转二进制,每次取小数位2,取整数
0.5
2 = 1.0 (1)
02 = 0 (0)
0
2 = 0 (0) …
0.5 -> 1.0
20.5 -> 10100.1

示例: 20.3

20 -> 10100
0.32 = 0.6 (0)
0.6
2 = 1.2 (1)
0.22 = 0.4 (0)
0.4
2 = 0.8(0)
0.82=1.6 (1)
0.6
2 = 1.2 (1)
0.22 = 0.4 (0)
0.4
2 = 0.8(0)
0.8*2=1.6 (1)
0.3 -> 010011001…1001
20.3 -> 10100.0100110011001…1001

浮点类型的表达方式

采用科学计数法,分为三部分:

  1. 尾数
  2. E/e
  3. 指数

举例 : 1234500000000000 采用科学计数法 : 1.2345E15

	 float f2 = 3e2; //3*10^2
     cout << "f2 = " << f2 << endl;
 
     float f3 = 3e-2; //3*0.1^2
     cout << "f3 = " << f3 << endl;
浮点型存储方式

在这里插入图片描述

类型符号位指数位尾数位
float1823
double11152
long double16463

float的指数范围为-127 ~ 128,double的范围是-1023 ~ 1024, long double的范围为 -2^63-1 ~ 2^63

示例:20.5

二进制: 10100.1
科学计数法: 1.01001E4 = 1.01001E100
存储: 0-10000011-01001000000000000000000
 科学计数法中的E是可以出现负数的,所以IEEE 754规定,E的真实值必须再减去一个中间数(以移位存储),对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023
 2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001
 2^4的E是4,所以保存成32位浮点数时,必须保存成4+127=131,即10000011

示例:20.3

二进制: 10100.0100110011001…1001
科学计数法: 1.01001E4 = 1.01000100110011001…E100
存储: 0-10000000011-01000100110011001…

代码转换(十进制浮点数 -> 存储方式)

    float v1 = 20.3;
    unsigned int *n = (unsigned int*)(&v1);
    for(int i = 31; i >=0;i--)
    {
        cout << (*n>>i & 1) << (i == 31 || i == 23?"-":"") ;
    }
    cout << endl;

    double v2 = 20.3;
    unsigned long long *m = (unsigned long long*)(&v2);
    for(int i = 63; i >=0;i--)
    {
        cout << (*m>>i & 1) << (i == 63 || i == 52?"-":"") ;
    }
    cout << endl;
浮点型的输出
	// float类型赋值
    float f_v = 123.4F;    
    float v1 = 565.292484256;
   
    printf("%0.7f\n", v1);  // 565.2924805
    printf("%0.12f\n", 1e7 / 9.0); // 1111111.111111111008
    printf("%0.12f\n", 1e7F / 9.0F); // 11111111.125000000000

不同浮点类型,取相同精度获得的结果可能不一致,取精度时需要慎重考虑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值