Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ ISO/IEC在不同字符集编码(如UTF-16)中混淆sizeof(char)_C++_Language Lawyer_Sizeof_Utf 16 - Fatal编程技术网

C++ ISO/IEC在不同字符集编码(如UTF-16)中混淆sizeof(char)

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是

假设程序在具有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是否只是一个默认(定义)值,并且将根据每个系统定义实现?

否,没有冲突。这两个语句引用不同的字节定义

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
及其变体是内存寻址的基本单元,这是字节的主要含义<