【C++】基本数据类型

文章讨论了C++中整型变量未初始化时的输出行为,不同平台可能有不同的结果。Java语言对此有更严格的编译检查。文章还涵盖了整型溢出问题,数据类型的字节大小,以及浮点数精度问题。此外,提到了bool类型、浮点数比较的方法以及auto类型的使用和类型转换的规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

整型 Integer Number

变量的初始化
#include <iostream>

using namespace std;

int main()
{
    int num1, num2;
    cout << "num1 = " << num1 << endl;
    cout << "num2 = " << num2 << endl;
}

这里定义了两个整型变量num1num2,没有对其进行初始化就直接输出。但编译器并不会报错,因为没有语法错误。
程序的输出结果与编译器有关,比如x86平台的输出为

num1 = 4354254
num2 = 7208832

而ARM平台的结果为

num1 = 0
num2 = 0

对于Java语言,如果不初始化直接编译,编译器就会报错。

不同的初始化方式
int num = 10;

// New Standard
int num (10);

int num {10};
溢出 Overflow
#include <iostream>

using namespace std;

int main()
{
    int a = 56789;
    int b = 56789;
    int c = a * b;
    cout << c << endl;
}

正确结果应该为3,224,990,521,但程序输出为-1069976775。
3,224,990,521对应16进制为0xC0397339,一共32位,最高位C大于8,那么对应二进制的最高位就是1。而对于int类型,其32位的最高位代表符号位(sign bit),若符号位为1,则代表这个变量是负数。要输出正确结果,可将int改为unsigned int
在这里插入图片描述

int的范围: [ − 2 31 , 2 31 − 1 ] [-2^{31},2^{31}-1] [231,2311]
unsigned int的范围: [ 0 , 2 32 − 1 ] [0,2^{32}-1] [0,2321]

数据类型所占字节数

一般来说,int类型占4个字节,即32位(有少部分系统是16位)。
对于short类型,最低要求是2个字节(16位);对于long类型,最低要求是4个字节(32位);对于long long类型,最低要求是8个字节(64位)。C++语言没有强制规定这些类型必须占多少字节,有可能long类型和int类型均为4个字节,需要具体验证。
查看某一类型在当前系统所占的字节数:

cout << "sizeof(int) = " << sizeof(int) << endl;
cout << "sizeof(short) = " << sizeof(short) << endl;
cout << "sizeof(long) = " << sizeof(long) << endl;

字符型 Char

实际上是一个8位整数,可以用signedunsigned修饰,但不同的平台是不一样的,C++没有具体规定。

char c1 = 'C';
char c2 = 80;
char c3 = 0x50;

// Chinese Character
char16_t c4 = u'啊'; // C++11
char32_t c5 = U'啊'; // C++11

char16_tchar32_t分别表示16位和32位的char。前面的u和U表示把后面的字符转换成对应的数据类型。
使用下面的语句打印结果:

cout << c1 << ":" << c2 << ":" << c3 << endl;
cout << +c1 << ":" << +c2 << ":" << +c3 << endl;
cout << c4 << endl;
cout << c5 << endl;

输出结果:

C:P:P
67:80:80
21834
21834

第一行为打印c1c2c3对应的字符,如果想要打印字符对应的整数,可以在前面加一个+,将其强制转换为整型。

布尔类型 bool

在C++中是一种数据类型,占1个字节(8位),但在C语言中不是一种数据类型。
只有两种取值true(1)false(0),可以当做具体的数值来计算。

与bool类型相关的类型转换
int a;
bool b = true;
a = b;
bool c = -123;

● 将b赋值给aa的值为1。
● 将任意数赋值给bool类型的变量,只要这个数不是0,bool类型的变量就是1。

浮点数类型

在这里插入图片描述
double为双精度,long double为扩展精度(64位or128位)。
深度学习中涉及半精度(half precision),不是C++的标准。

浮点数的精度

执行以下代码

#include <iomanip>
using namespace std;
int main()
{
    float f1 = 1.2f;
    float f2 =  f1 * 1000000000000000;
    cout << std::fixed << std::setprecision(15) << f1 << endl;
    cout << std::fixed << std::setprecision(15) << f2 << endl;
    return 0;
}

输出结果为

1.200000047683716
1200000038076416.000000000000000

可以看到,f1的输出并不是1.2,f2的输出也和正确的结果有一定的差距,这与浮点数的表示方法有关,可以参考PAM信号里的量化来理解。
让一个极大的数(1.23E10+f)和一个极小的数(123)相加,如果这个极小的数没有超过量化间隔,那么结果仍然还是1.23E10。
在实际应用中,判断两个浮点数相等,通常采取下面的方式:

if (f1 == f2)  //bad
{
    // ...
}

if (fabs(f1 - f2) < FLT_EPSILON) // good
{
    // ...
}

fabs()为绝对值,FLT_EPSILONfloat类型所能识别的最小精度。

auto类型

是一种自动的类型,根据赋值来确定变量类型。

auto a = 2; // type of a is int
auto b = 2.3; // type of b is double
auto c; // valid in C, error in C++
auto d = a * 1.2;

对于C++,使用auto初始化一个变量,必须赋值。而在赋值之后,变量的类型就被确定下来,不会发生改变。

auto a = 2;
a = 2.3;

这里a仍然是2,程序会将2.3的小数部分截去,只留下整数部分,赋值给a

类型转换

int num_int1 = 'C';
int num_int2 = (int)'C'; // C style
int num_int3 = int('C'); // C++ style

上面三行都是类型转换。第一行属于隐式转换,后两种属于显式转换。其中,第二行为C语言的写法,第三行为C++的写法。

int num_int4 = 2.8;
float num_int5 = 2.3;
short num_int6 = 10000000;

第一行,属于double型转换为int型,直接截去小数部分,把整数部分赋给num_int4
第二行,属于double类型转换为float类型,可能会损失精度。
第三行,10000000已经超过了short类型所能表示的最大值,编译器会发出warning

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值