c u8数据类型 对应java_C/C++基础----变量和基本类型

变量和基本类型

不同平台下基本类型的字节数

类型

16位平台

32位平台

64位平台

char

1

1

1

short

2

2

2

int

2

4

4

long

4

4

8

long long

/

8

8

指针

2

4

8

float

4

4

4

double

8

8

8

类型的最小尺寸

类型

含义

最小尺寸

bool

布尔类型

未定义

char

字符

8位

wchar_t

宽字符

16位

char16_t

Unicode字符

16位

char32_t

Unicode字符

32位

short

短整型

16位

int

整型

16位

long

长整型

32

long long

长整型

64

float

单精度浮点数

6位有效数字

double

双精度浮点数

10位有效数字

long double

扩展双精度浮点数

10位有效数字

数据类型选择的经验准则

当知晓数值不可能为负时,选用无符号类型

使用int执行整数运算,short常常太小,long和int一般尺寸一样。如果int不够,用long long。

在算数表达式中不要使用char或bool,使用char特别容易出问题。如果要使用一个不大的整数,那么明确执行为signed char或unsigned char。

执行浮点数运算用double,float通常进度不够而且两者计算代价相差无几。Long double一般没有必要,且消耗不容忽视。

有符号类型和无符号类型

无符号类型赋值超出其范围,结果是取模后的值。如unsigned char c = -1;  //假设char占8bit,c的值为255

有符号类型赋值超出其范围,结果未定义。如signed char c2 = 256;  //假设char占8bit,c2的值未定义

切勿混用带符号类型和无符号类型。

算数表达式中既有无符号数又有带符号数,带符号的数会转换成无符号的数

指定字面值的类型

字符和字符串字面值

前缀

含义

类型

u

Unicode16字符

char16_t

U

Unicode32字符

char32_t

L

宽字符

wchar_t

u8

UTF-8(仅用于字符串字面常量)

char

整型字面值

浮点字面值

u or U

unsigned

f or F

float

l or L

long

l or L

long double

ll or LL

long long

初始化与赋值

初始化和赋值是两个完全不同的操作。

定义于函数体(块作用域)内的内置类型的对象如果没有初始化,则其值未定义。养成初始化内置变量的习惯。

类的对象如果没有显式地初始化,则其值由类确定。

声明与定义

声明使得一个名字为程序所知,定义会申请存储空间,还可能为其赋初始值

(分离式编译)

如果想声明一个变量而非定义它,就在变量名前添加关键字extern,而且不要显式地初始化变量

对于复杂的声明语句,可以从变量名从右往左理解

指针

常见错误:解引用无效指针(空指针或已释放的指针)

建议:初始化所有指针,并且尽量等定义了对象之后再定义指向它的指针。

推荐nullptr而非0,0指针具有二义性。

const和constexpr

const对象默认在文件内有效,当多个文件出现了同名const变量,等同于不同文件中定义了独立的变量。

如果想不同文件之间共享const,则不管在声明还是定义中都添加extern关键字。

顶层const表示本身是个常量,底层const表示指针指向的对象是一个常量。

执行对象拷贝操作时,顶层const不受影响,底层const却不容忽视

常量表达式:值不会改变且在编译阶段就能计算结果的表达式。

复杂系统中很难分辨初始化是不是常量表达式,C11允许声明为constexpr由编译器来验证

尽管指针和引用可以定义成constexpr,其初始值受到严格的限制。constexpr指针的初始值必须是nullptr或者0,或者是储存于某个固定地址中的对象。储存于函数体之外的对象其地址固定不变,能用来初始化constexpr指针。

auto与decltype

auto一般会忽略掉顶层const,同时保留底层const。

decltype的表达式是一个变量,则decltype返回该变量的类型,包括顶层const和引用在内。

decltype如使用的表达式不是一个变量,则返回表达式结果对应的类型。

如表达式是解引用操作,则得到引用类型。

如果是加了双层括号的变量,则结果永远是引用。

预处理变量无视C++中关于作用域的规则

你可能感兴趣的:(c,u8数据类型,对应java)