【C++学习】数据类型
Published in:2024-08-10 | category: C++
Words: 2.6k | Reading time: 10min | reading:

整型

short

大小

  • 16 位(2 字节)
  • 由于它是整型,所以内存中的布局取决于系统的字节序(大端或小端)。
    字节序
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <stdio.h>
    int main()
    {
    unsigned int x = 0x12345678;
    char* c = (char*)&x;
    if (*c == 0x78) { //*c代表x在内存地址上的第一个字节
    printf("Little endian");
    }
    else {
    printf("Big endian");
    }
    return 0;
    }

范围

  • short: -32,768 - 32,767
  • unsigned short: 0 - 65,535 (2^8=65536)

溢出

  • 如果对 short 变量赋值超出其范围,将会发生溢出。例如,尝试将 32,769 赋值给一个有符号 short 变量会导致溢出。
  • 溢出会导致变量值“环绕”回其范围的另一端。例如,如果 short 变量的值为 32,767,然后增加 1,它将变为 -32,768。

int

大小

  • 32 位(4 字节)

范围

  • int: -2,147,483,648 - 2,147,483,647
  • unsigned int: 0 - 4,294,967,295 (2^32)

long

long类型和指针类型需要特别注意,编写跨平台的软件时尽量不要使用long类型,或者需要对long类型做特殊处理。

大小

  • widows4字节,linux32位4字节,linux64位8字节

范围

  • long: -2,147,483,648 - 2,147,483,647
  • unsigned long: 0 - 4,294,967,295 (2^32)

long long

大小

  • 64 位(8 字节)

范围

  • long long: -9,223,372,036,854,775,808 - 9,223,372,036,854,775,807
  • unsigned long long: 0 - 18,446,744,073,709,551,615 (2^64)

字符型

char

适用于需要存储单个字符的场景

大小

  • 8 位(1 字节)

范围

  • char: -128 - 127
  • unsigned char: 0 - 255

wchar_t

对比一下wchar_tchar,这两个在C/C++编程中常用的数据类型。

  1. 存储大小
    • char:通常占用1个字节(8位)的存储空间。它被用来存储ASCII字符集中的字符,因为ASCII字符集只需要7位就能表示所有的字符。
    • wchar_t:宽字符类型,通常占用2个或4个字节。它被用来存储宽字符,比如Unicode字符集中的字符。Unicode字符集包含了世界上大多数文字系统的字符,所以需要更多的存储空间。
  2. 用途
    • char:主要用于处理ASCII字符集或单字节编码的字符集。在C/C++中,它是最基本的字符类型。
    • wchar_t:用于处理宽字符集,如Unicode。它允许你处理包含非ASCII字符的文本,这对于国际化和本地化非常重要。
  3. 可移植性
    • char:在所有C/C++实现中都是1个字节,具有很好的可移植性。
    • wchar_t:大小依赖于实现和平台。在32位系统中,它通常是4字节,在16位系统中,通常是2字节。这种差异可能导致代码在不同平台上的行为不一致。
  4. 字符串表示
    • char:在C/C++中,char数组或指针常用来表示和操作字符串。
    • wchar_t:用于表示宽字符串,通常在字符串前加上L前缀,如L"Hello World"
  5. 标准库支持
    • char:标准库中的大多数字符串处理函数,如strlenstrcpy等,都是针对char类型设计的。
    • wchar_t:C/C++标准库也提供了一些宽字符串处理函数,如wcslenwcscpy等,用于处理wchar_t类型的字符串。
      总的来说,charwchar_t的主要区别在于它们存储字符的方式和大小。char适用于ASCII或单字节编码的字符,而wchar_t则用于处理需要更多存储空间的宽字符,如Unicode字符。不过,由于wchar_t的大小依赖于平台,现代C++更倾向于使用char16_tchar32_t以及Unicode字符串字面量来处理Unicode字符,以提供更好的可移植性和一致性。

布尔类型

布尔类型用于存储真(true)或假(false)的值。

bool

  • 通常占用1字节。
  • 取值为 truefalse

浮点类型

(歪个楼,我的Cybery宝宝回答的比智谱清言要好欸)
(再歪一下,过两天给宝做个自己的皮套💕)

float

大小

通常占用4个字节(32位)的存储空间。

表示

  • 根据IEEE 754标准,一个float类型的值通常包括1位符号位、8位指数位和23位尾数位。

    浮点数的表示

    浮点数的表示类似于科学记数法,它由两部分组成:一个基数和一个指数。在浮点数的二进制表示中,基数通常是2(对于十进制浮点数,基数是10),而指数和尾数则用特定的位来表示。

    • 尾数位(Fraction/Mantissa)
      尾数位(或尾数)是浮点数中用来表示数字的“有效数字”部分,也就是不包括前导的1(对于规范化浮点数)或0(对于非规范化浮点数)的部分。尾数位决定了浮点数的精度,就像尺子上的刻度越密,你就能越精确地测量长度一样。
      在IEEE 754标准中,尾数位通常省略了最前面的1(因为规范化浮点数的第一个有效数字总是1),所以尾数位实际上表示的是小数点后的部分。例如,对于二进制数1.101,尾数位就是101。
    • 指数位(Exponent)
      指数位表示2的幂次,它决定了尾数位应该乘以2的多少次方。在IEEE 754标准中,指数位是一个带偏移的值,这意味着实际指数是指数位表示的值减去一个固定的偏移量(对于单精度浮点数,这个偏移量是127)。
      例如,如果指数位表示的值是130(二进制为10000010),那么实际的指数是130 - 127 = 3。这意味着尾数位应该乘以2^3,也就是8。
    • 结合尾数位和指数位
      对于二进制表示的浮点数 0 10000010 10100000000000000000000
      • 符号位:0(表示正数)
      • 指数位:10000010(二进制),转换为十进制是 130,减去偏移量 127,得到实际指数是 3。
      • 尾数位:10100000000000000000000,加上隐含的 1(对于规范化浮点数),实际尾数是 1.10100000000000000000000(二进制)。
        现在,让我们将尾数转换为十进制:
        1.10100000000000000000000(二进制)= 1 * 2^0 + 1 * 2^-1 + 0 * 2^-2 + 1 * 2^-3 + … (只有前三位的计算对最终结果有影响,因为后续的0不改变值)
        = 1 + 0.5 + 0 + 0.125 + … (其他位都是0,所以可以忽略)
        = 1.625(十进制)
        现在,将尾数乘以 2 的指数:
        1.625 * 2^3 = 1.625 * 8 = 13(十进制)
  • 它能提供大约6-7位的十进制精度。

  • float类型通常用于那些不需要非常高精度的计算,或者当你需要大量浮点数并且内存使用效率很重要时。

double

精度

double通常占用64位(8字节)的存储空间。在大多数现代计算机中,按照IEEE 754标准,double可以提供大约15-17位十进制数的精度。

表示范围

double能表示的数值范围大约在10^-308到10^308之间。这意味着它既可以表示非常小的数,也可以表示非常大的数。

默认初始化值

如果你声明了一个double变量但没有初始化它,它将包含一个未定义的值,通常是垃圾数据。

long double

long double通常比double占用更多的存储空间,具体大小依赖于平台和编译器。在一些系统上,它可能占用96位或128位(12或16字节),但这并不是固定的。

转义字符

转义字符 含义 ASCII码值(十进制)
\a 警报 007
\b 退格(BS),将当前位置移到前一列 008
\f 换页(FF),将当前位置移到下页开头 012
\n 换行(LF),将当前位置移到下一行开头 010
\r 回车(CR),将当前位置移到本行开头 013
\t 水平制表(HT)(跳到下一个TAB位置) 009
\v 垂直制表(VT) 011
\ 反斜线字符 092
' 单引号 039
" 双引号 034
? 问号 063
\0 数字0 000
\ddd 8进制转义字符,d范围0-7 3位8进制
\xhh 16进制转义字符,h范围0-9,a-f,A-F 3位16进制

字符串型

C风格字符串

char 变量名[] = “字符串值”

1
2
3
4
5
6
7
8
9
int main() {

char str1[] = "hello world";
cout << str1 << endl;

system("pause");

return 0;
}

char str1[]char* str1[] 在C语言中是两种不同的声明方式,它们分别表示不同的数据类型和内存布局。

  1. char str1[]
    • 这是一个字符数组,它声明了一个数组,其元素类型为 char
    • 这个数组可以存储一系列的字符,并且这些字符连续存储在内存中。
    • 声明时可以指定数组的大小,也可以在初始化时由编译器自动计算大小。
    • 例如:char str1[] = "Hello, World!"; 这里 str1 是一个字符数组,包含字符串 “Hello, World!” 以及一个空字符 \0 作为字符串的结束标志。
  2. char* str1[]
    • 这是一个指向字符的指针数组,它声明了一个数组,其元素类型为 char*
    • 这个数组中的每个元素都是一个指向 char 类型的指针,也就是说,每个元素都可以指向一个字符串。
    • 常用于声明一个字符串数组,每个元素都是指向不同字符串的指针。
    • 例如:char* str1[] = {"Hello", "World", "!"}; 这里 str1 是一个指针数组,其中 str1[0] 指向字符串 “Hello”,str1[1] 指向字符串 “World”,以此类推。
      以下是一个具体的例子来说明两者的不同:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      #include <stdio.h>
      int main() {
      // 字符数组
      char str1[] = "Hello, World!";
      // 指向字符的指针数组
      char* str2[] = {"Hello", "World", "!"};
      // 输出 str1
      printf("str1: %s\n", str1);
      // 输出 str2 中的每个字符串
      printf("str2[0]: %s\n", str2[0]);
      printf("str2[1]: %s\n", str2[1]);
      printf("str2[2]: %s\n", str2[2]);
      return 0;
      }
      在这个例子中,str1 是一个包含 “Hello, World!” 字符串的字符数组,而 str2 是一个包含三个字符串指针的数组。

C++风格字符串

string 变量名 = “字符串值”

1
2
3
4
5
6
7
8
9
int main() {

string str = "hello world";
cout << str << endl;

system("pause");

return 0;
}

###########################完结撒花###########################

那嘛一挖---米子哈!!!
那嘛一挖---米子哈!!!
Prev:
【C++学习】运算符
Next:
【C++学习】程序基础部分