为什么Rust中的`char`大小为4个字节?

Ang*_*gel 7 rust

此代码显示char需要4个字节:

println!("char : {}", std::mem::size_of::<char>());
Run Code Online (Sandbox Code Playgroud)
  1. 为什么需要4个字节?
  2. 大小取决于平台,还是总是4个字节?
  3. 如果它总是4个字节,那是特殊的东西吗?
  4. 编译器是否保证尺寸的最小尺寸char

https://play.rust-lang.org/我也得到4个字节

Mat*_* M. 11

首先:charRust中的一个唯一的整数值表示Unicode标量值.例如,考虑一下(又名桩的Poo,又名U + 1F4A9),在Rust中它将由a表示char,其值为128169十进制(0x1F4A9以十六进制表示):

fn main() {
    let c: char = "".chars().next().unwrap();
    println!(" is {} ({})", c, c as u32);
}
Run Code Online (Sandbox Code Playgroud)

在围栏上.

据说,Rust char是4个字节,因为4个字节是2个字节的最小功率,它可以保存任何Unicode标量值的整数值.该决定是由域驱动的,而不是由架构限制驱动的.


注意:对标量值的强调是我们看到的许多"字符"实际上是由Unicode中的多个组合字符组成的字形,在这种情况下char需要多个字符.


DK.*_*DK. 6

char是四个字节。它始终是四个字节,它将始终四个字节。它是四个字节,并且将保留四个字节。

这不是为了什么特别的事情;四个字节只是可以存储任何 Unicode 标量值的 2 的最小幂。各种其他语言做同样的事情。


Fyl*_*lux 5

Char是四个字节,它不依赖于架构。

为什么?根据 UTF-8 维基百科的文章。

前 128 个字符 (US-ASCII) 需要一个字节。接下来的 1,920 个字符需要两个字节进行编码。基本多语言平面的其余部分中的字符需要三个字节,其中几乎包含所有常用字符。Unicode 其他平面中的字符需要四个字节。

因此,如果您想表示任何可能的Unicode 字符,编译器必须节省 4 个字节。

您还应该考虑字节对齐:http : //www.eventhelix.com/realtimemantra/ByteAlignmentAndOrdering.htm

  • 请注意,`char` 不存储 UTF-8 代码点。`char` 实际上是一个 UTF-32 代码点,即只是一个 Unicode 标量值。 (8认同)
  • @VladimirMatveev 你混淆了术语。UTF-8 具有 8 位代码**单位**,UTF-32 具有 32 位代码**单位**。它们没有不同的代码点,只是 0 到 0x10FFFF 之间的值,但它们以不同的方式将它们编码为代码单元。Rust `char` 不是一个代码点,而是一个 Unicode 标量值,它具有相同的范围,但不包括代理代码点值。UTF-16 使用代理代码点来表示所有 Unicode 标量值。有效的 UTF-8 或 UTF-32 不应解码为代理代码点,但可以解码为任何标量值,从而解码为“char”。 (3认同)
  • @VladimirMatveev 不存在 UTF-8 代码点或 UTF-32 代码点之类的东西。只有代码点,它们是抽象意义上的数字。UTF-8 和 UTF-32 对这些代码点的编码方式不同。 (3认同)