51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

【C++学习】数据类型

整型 {#整型}

short {#short}

大小 {#大小}

  • 16 位(2 字节)

  • 由于它是整型,所以内存中的布局取决于系统的字节序(大端或小端)。 字节序
    "字节序"是个什么鬼? https://zhuanlan.zhihu.com/p/21388517

    |---------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | 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 {#int}

大小 {#大小-1}

  • 32 位(4 字节)

范围 {#范围-1}

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

long {#long}

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

大小 {#大小-2}

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

范围 {#范围-2}

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

long long {#long-long}

大小 {#大小-3}

  • 64 位(8 字节)

范围 {#范围-3}

  • 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 {#char}

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

大小 {#大小-4}

  • 8 位(1 字节)

范围 {#范围-4}

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

wchar_t {#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 {#bool}

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

浮点类型 {#浮点类型}

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

float {#float}

大小 {#大小-5}

通常占用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}

精度 {#精度}

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

表示范围 {#表示范围}

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

默认初始化值 {#默认初始化值}

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

long 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风格字符串 {#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++风格字符串 {#C-风格字符串}

string 变量名 = "字符串值"

|---------------------------|----------------------------------------------------------------------------------------------------| | 1 2 3 4 5 6 7 8 9 | int main() { string str = "hello world"; cout << str << endl; system("pause"); return 0; } |

###########################完结撒花###########################
那嘛一挖---米子哈!!! 那嘛一挖---米子哈!!!

赞(1)
未经允许不得转载:工具盒子 » 【C++学习】数据类型