本篇文章开始介绍C++
本篇文章介绍C++基本类型相关的概念和注意事项
对于基本类型int、short、long、long long。默认都是带符号的,如果使用不带符号的类型,需要在前面添加关键字unsigned
对于char类型,默认是带符号还是不带符号根据编译器而定。虽然书上是这么说的,但是我使用xcode、vs2022和linux上用gcc编译对比结果都是把char当作signed char处理的。
类型选择的一般规律:
执行浮点数计算用double
,因为double的运算速度不比float差,甚至会更好。并且double的精度比较高。下面是类型转换的一般规则:
当我们把一个非布尔类型的算术值赋给布尔类型时,初始值为0。则结果为false, 否则结果为true。
当我们把一个布尔值赋给非布尔类型时,初始值为false则结果为0,初始值为true则结果为1
当把一个浮点数赋值给整数时,会向0的方向进行截断,只保留整数部分
,例如3.14会变成3,-3.14会变成-3。
当把一个整数类型赋值给浮点数时,小数部分变为0,如果该整数占用的空间超过浮点类型的容量,精度可能损失。
当无符号数和有符号数之间进行数据转换的时候,内存数据不变,只改变数据的解释方式
。
比如下面的例子:(PRINTBIT为打印数据内存二进制的宏,具体的定义参考文章https://blog.csdn.net/b1049112625/article/details/135251974)
int main(int argc, const char * argv[])
{
unsigned char a =255;
char b = a;
PRINTBIT(a);
PRINTBIT(b);
printf("a=%hhu\n",a);
printf("b=%hhd\n",b);
return 0;
}
输出:
11111111
11111111
a=255
b=-1
运算之前,有符号数先转成无符号数
for(unsigned int u=10; u>=0; u--)
{
std::cout < u < std:: endl;
}
因为u是无符号数,所以无论怎么调用u–,他一直是个非负数,所以循环不会结束总结:不要混用有符号数和无符号数
一个字面值可以通过添加前缀或者后缀来表明类型,下面列出前缀的修饰符
下面是后缀的修饰符:
在C++11标准中,可以使用列表初始化来为变量赋初值,可以按照下面这两种方式使用:
int a = {0};
int b{1};
列表初始化有个特点,如果我们使用列表初始化且初始值存在丢失信息的风险,则编译器将报错,看下面的例子:
int c = 3.14;
int d(3.14);
int a = {3.14};
int b{3.14};
c、d不会报错,a、b会报错。
变量能且只能被定义一次,但是可以被多次声明