簡體   English   中英

一個字符串占用多少字節? 一個字符?

[英]How many bytes does a string take? A char?

我正在復習我第一學期的 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' :與第一個字符相同,不是字符串,一個字節。
  • "\\n" : 三個字節.. 一個用於 \,一個用於換行符,一個用於空字符
  • "" :一個字節,只是空字符。
  • 根據定義,一個char占用一個字節。
  • 使用'的文字是字符文字; 使用"的文字是字符串文字。
  • 字符串文字是隱式以空值結尾的,因此它將比文字中可觀察到的字符數多占用一個字節。
  • \是轉義字符, \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'   - 0x6e
"n"   - 0x6e00
'\n'  - 0x0a
"\n"  - 0x0a00
"\\n" - 0x5c6e00
""    - 0x00

您似乎指的是字符串常量。 並將它們與字符常量區分開來。

char在所有架構上都是一個字節。 字符常量使用單引號分隔符'

字符串是一個連續的字符序列,帶有一個尾隨 NUL 字符,用於標識字符串的結尾。 字符串使用雙引號字符 '"'。

此外,您還介紹了使用黑斜線表示特殊字符的 C 字符串常量表達式語法。 \n是字符串常量中的一個字符。

因此對於示例'n', "n", '\n', "\n"
'n'是一個字符
"n"是一個有一個字符的字符串,但它需要存儲兩個字符(一個用於字母n ,一個用於 NUL
'\n'是一個字符,換行符(基於 ASCII 的系統上的 ctrl-J)
"\n"是一個字符加一個 NUL。

我讓其他人根據這些來解謎。

'n' -> 一個char 一個char總是 1 個字節。 這不是一個字符串。
"n" -> 一個字符串文字,包含一個n和一個終止 NULL char 所以2個字節。
'\n' -> 一個char ,一個char總是 1 個字節。 這不是一個字符串。
"\n" -> 一個字符串文字,包含一個\n和一個終止 NULL char 所以2個字節。
"\\n" -> 一個字符串文字,包含一個\ 、一個 '\n' 和一個終止 NULL char 所以3個字節。
"" -> 一個字符串文字,包含一個終止 NULL char 所以1個字節。

可能晚了10年。 但是如果你只使用“Hello”,它只是一個字符數組,所以這將占用的字節數是這個字符數組的字符數(在這種情況下為 5)+ 1(一個 NULL 字符),這將是6 在這種情況下。 因此,您可以采用以下規則:對於 c_strings(char 數組):字符數 + 1

您還可以使用 "include " 和 std::string = "Your text here"; 之后訪問 c++ 字符串。

此 c++ 字符串始終具有固定大小(在我的機器上為 28 字節)。

取決於是否使用 UTF8 一個 char 是 1byte 如果 UTF16 一個 char 是 2bytes 無關緊要 字節是 00000001 還是 10000000 一個完整的字節被注冊並為該字符保留,一旦聲明用於初始化,如果 char 改變了這個寄存器用新的價值。

一個字符串字節等於“”之間的字符數。

例子:11111111是一個填充字節,UTF8 char T = 01010100(1個字節)

UTF16 字符 T = 01010100 00000000(2 個字節)

UTF8 字符串“編碼”= 011000110110111101100100011010010110111001100111(6 字節)

UTF16 字符串“編碼”= 011000110000000001101111000000000110010000000000011010010000000001101110000000000110011100000000(12 字節)

UTF8 \n = 0101110001101110(2 字節)

UTF16 \n = 01011100000000000110111000000000(4 字節)

注意:您鍵入的每個空格和每個字符在編譯器中占用 1-2 個字節,但空間很大,除非您在 90 年代初為計算機或游戲機鍵入 4mb 或更少的代碼,否則您不必擔心關於字符串或字符的字節。

對內存有問題的事情是調用需要使用浮點數、小數或雙精度數進行大量計算的事情,並在循環或更新方法中使用數學隨機數。 最好在運行時或在固定時間更新上運行一次,並在整個時間跨度內取平均值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM