C++ ISO/IEC在不同字符集编码(如UTF-16)中混淆sizeof(char)
假设程序在具有UTF-16编码字符集的系统上运行。所以根据C++编程语言——第四,第150页: 字符可以保存机器字符集的字符 → 我认为char变量的大小是2字节 但根据ISO/IEC 14882:2014:C++ ISO/IEC在不同字符集编码(如UTF-16)中混淆sizeof(char),c++,language-lawyer,sizeof,utf-16,C++,Language Lawyer,Sizeof,Utf 16,假设程序在具有UTF-16编码字符集的系统上运行。所以根据C++编程语言——第四,第150页: 字符可以保存机器字符集的字符 → 我认为char变量的大小是2字节 但根据ISO/IEC 14882:2014: sizeof(char),sizeof(signed char)和sizeof(unsigned char)为1” 或C++编程语言-第四,第149页: […],因此根据定义,字符的大小为1 → 它是固定的,大小为1 问题:以上陈述与以下陈述之间是否存在冲突 sizeof(char)=1是
sizeof(char)
,sizeof(signed char)
和sizeof(unsigned char)
为1”
或C++编程语言-第四,第149页:
[…],因此根据定义,字符的大小为1 → 它是固定的,大小为1 问题:以上陈述与以下陈述之间是否存在冲突sizeof(char)=1是否只是一个默认(定义)值,并且将根据每个系统定义实现?否,没有冲突。这两个语句引用不同的字节定义
UTF-16意味着字节和八位字节是一样的——一组8位
< C++语言中的字节>与“代码> char < />代码相同。对C++字节可以包含多少位没有限制。C++字节的位数是由代码< CARLYBIT/<代码>宏常量定义的。< /P>
<>如果你的C++实现决定使用16个比特来表示每个字符,那么<代码> CARYBIT/<代码>将是16,每个C++字节将占据两个UTF 16字节。<代码> siZeOf(char)< /C> >仍然是1,所有对象的大小都将以16位字节来测量。 < P> C++标准(和C,对于这一点)有效地将byte
定义为char
类型的大小,而不是8位的数量1。根据C++11 1.7/1
(我的粗体):
< C++内存模型中的基本存储单元是字节。字节在<强>至少< /强>中,足以容纳基本执行字符集的任何成员和Unicode UTF-8编码格式的八位代码单元,并由一个连续的位序列组成,<强>其数目是定义实现。< / ST。荣>
因此,无论发生什么情况,sizeof(char)
表达式始终为1
如果您想查看char
变量(可能unsigned
变量最好)的基线是否可以实际保存16位值,那么您要查看的项目是
中的char\u-bit
。这将保存char
变量中的位数
1许多标准,特别是与通信协议相关的标准,使用更精确的术语“八位字节”来表示八位值。字符定义为1字节。字节是最小的可寻址单元。在普通系统中为8位,但在某些系统中为16位、32位或其他任何单位(但对于C++必须至少为8)
这有点令人困惑,因为在流行的行话中,字节用于技术上称为八位字节(8位)的内容
所以,你的第二和第三句话是正确的。严格来说,第一句话是不正确的
< C++ >标准中的[Pr.OntReals/] 1定义,<代码> char < />只需要能够保存基本的执行字符集,它大约是100个字符(所有这些字符集出现在ASCII的0到127范围内),以及构成UTF-8编码的八位字节。这也许就是作者所指的机器字符集。
在硬件可八位寻址但字符集为Unicode的系统上,char
很可能保持8位。但是也有类型char16\u t
和char32\u t
(在C++11中添加)对于具有16位或32位字符集的系统,这些字符设计用于代码中,而不是char
因此,如果系统使用char16\u t
,那么您将使用std::basic\u string
而不是std::string
,依此类推
具体如何处理UTF-16将取决于系统选择的实现细节。Unicode是一个21位字符集,UTF-16是它的多字节编码;因此系统可以像Windows一样使用std::basic_string
对字符串进行UTF-16编码;也可以使用std::basic_string
以原始Unicode代码点作为字符
阿尔夫的帖子对可能出现的一些问题进行了更详细的说明。
< P>是的,阿纳尔的C++合并在代码< char < /C>中有很多严重的冲突和问题,但问题也会使一些事情发生混淆。因此,简单的直接回答就好像回答“是”、“否”或“不知道”。“你停止打你妻子了吗?”。唯一直接的答案是,不提这个问题
因此,让我们从事实开始
关于char类型的事实。
<> > <代码> char < />代码的位数由定义为<强> >代码> CARYBIT <强> >的代码实现,该代码保证为8或更大。用C++ 03和更早的保证来自C89标准中的符号,C++标准指出(在非规范部分,但仍然)作为“合并”。用C++ 11和以后的C++标准明确地,单独给出≥8保证。在大多数平台上,CHAR_BIT
是8,但在一些可能仍然存在的平台上,它是16,并且使用了其他值
无论CHAR\u位的值是多少,sizeof(CHAR)
的定义是1,即它不是实现定义的:
C++11§5.3.3/1(在[expr.sizeof]中):
“sizeof(char)
,sizeof(签名char)
和
sizeof(无符号字符)
为1
也就是说,char
及其变体是内存寻址的基本单元,这是字节的主要含义<