字符串需要多少字节?一个字符



我正在复习我的第一学期C++课,我想我错过了一些东西。一个字符串占用多少字节?炭?

我们得到的例子是,有些是字符文字,有些是字符串:

'n', "n", 'n', "n", "\n", ""

我对那里换行符的使用特别困惑。

#include <iostream>
 
int main()
{
    std::cout << sizeof 'n'   << std::endl;   // 1
    std::cout << sizeof "n"   << std::endl;   // 2
    std::cout << sizeof 'n'  << std::endl;   // 1
    std::cout << sizeof "n"  << std::endl;   // 2
    std::cout << sizeof "\n" << std::endl;   // 3
    std::cout << sizeof ""    << std::endl;   // 1
}
  • 单引号表示字符。
  • 双引号表示带有不可见NUL的 C 样式字符串终结者。

n(换行符(只是一个字符,\(反斜杠(也是如此。 \n只是一个反斜杠,后跟n

  • 'n' :不是字符串,是一个文字字符,一个字节,字母 n 的字符代码。
  • "n" :字符串,两个字节,一个用于 n,一个用于每个字符串末尾的空字符。
  • "n" :两个字节作为 代表"换行符",它需要一个字节,加上一个字节作为空字符。
  • 'n':与第一个相同,文字字符,不是字符串,一个字节。
  • "\n":三个字节..一个用于\,一个用于换行符,一个用于空字符
  • "":一个字节,只是空字符。
  • 根据定义,char占用一个字节。
  • 使用 ' 的文本是
  • 字符文本;使用 " 的文本是字符串文本。
  • 字符串文本隐式以 null 结尾,因此它将比文本中可观察的字符数多占用一个字节。
  • 是转义字符,n是换行符。

把这些放在一起,你应该能够弄清楚。

以下内容将在内存中获取 x 个连续字符:

'n' - 1 char (type char)
"n" - 2 chars (above plus zero character) (type const char[2])
'n' - 1 char
"n" - 2 chars
"\n" - 3 chars ('', 'n', and zero)
"" - 1 char

编辑:格式固定

edit2:我写了一些非常愚蠢的东西,感谢Mooing Duck指出这一点。

字符串占用的字节数等于字符串中的字符数加上 1(终止符(,乘以每个字符的字节数。每个字符的字节数可能会有所不同。常规char类型为 1 个字节。

所有示例的长度均为一个字符,但倒数第二个示例为两个字符,最后一个示例为零。(有些类型为 char,仅定义单个字符。

'n' -> 一个char . char始终为 1 个字节。 这不是字符串。
"n" -> 字符串文本,包含一个n和一个终止 NULL char 。 所以 2 个字节。
'n' -> 一个char,一个char总是1个字节。 这不是字符串。
"n" -> 字符串文本,包含一个n和一个终止 NULL char。 所以 2 个字节。
"\n" -> 字符串文本,包含一个、一个 '' 和一个终止 NULL char 。 所以 3 字节。
"" -> 字符串文本,包含一个终止 NULL char 。 所以 1 个字节。

您似乎指的是字符串常量。 并将它们与字符常量区分开来。

在所有体系结构上,char都是一个字节。 字符常量使用单引号分隔符'

字符串是具有尾随 NUL 字符的连续字符序列,用于标识字符串的末尾。 字符串使用双引号字符 '"'。

此外,您还介绍了 C 字符串常量表达式语法,该语法使用黑斜杠来指示特殊字符。 n 是字符串常量中的一个字符。

因此,对于示例'n', "n", 'n', "n"
'n'是一个字符
"n"是一个带有一个字符的字符串,但它需要两个存储字符(一个用于字母 n,一个用于 NUL
'n'是一个字符,换行符(在基于 ASCII 的系统上为 ctrl-J(
"n"是一个字符加一个 NUL。

我让其他人根据这些来解谜。

'n'   - 0x6e
"n"   - 0x6e00
'n'  - 0x0a
"n"  - 0x0a00
"\n" - 0x5c6e00
""    - 0x00

取决于是否使用 UTF8 字符是 1 字节,如果 UTF16 字符是 2 字节,则字节是 00000001 或 10000000 无关紧要,一旦声明初始化,就会为字符注册并保留一个完整的字节,如果字符更改,则此寄存器将使用新值更新。

字符串字节数等于 " 之间的字符数。

示例:11111111是填充字节,UTF8 字符 T = 01010100(1 字节(

UTF16 字符 T = 01010100 00000000(2 字节(

UTF8 字符串"编码"= 011000110110111101100100011010010110111001100111(6 字节(

UTF16 字符串"编码"= 011000110000000001101111000000000110010000000000011010010000000001101110000000000110011100000000(12 字节(

UTF8 = 0101110001101110(2 字节(

UTF16 = 01011100000000000110111000000000(4 字节(

注意:您键入的每个空格和每个字符在编译器中占用 1-2 个字节,但空间太大,除非您为 90 年代初的计算机或游戏机键入 4MB 或更小的代码,否则您不必担心字符串或字符方面的字节。

内存有问题的事情是调用需要大量计算的东西,包括浮点数、小数或双精度数,并在循环或更新方法中使用数学随机。最好在运行时运行一次或在固定时间更新上运行一次,并在时间跨度内取平均值。

最新更新