【问题标题】:Why are wchar_t / unsigned short now distinct, but there is no analogous char / unsigned byte distinction?为什么 wchar_t / unsigned short 现在是不同的,但没有类似的 char / unsigned byte 区别?
【发布时间】:2015-01-03 17:03:48
【问题描述】:

这里的设计看起来像是“没有一个想法”,因为现在 16 位的整数数据和字符数据是可微分的,而 8 位的整数和字符数据则不可微分。

对于 8 位值,C++ 始终只能选择 'char'。但是将 wchar_t 识别为与 unsigned short 不同的官方类型的功能可以进行改进,但仅适用于宽字符串用户。这似乎不协调;该语言对 8 位和 16 位值的行为不同。

我认为拥有更多不同的类型具有明显的价值;具有不同的 8 位字符 AND 和 8 位“字节”会更好,例如用于运算符重载。例如:

// This kind of sucks...
BYTE m = 59;     // This is really 'unsigned char' because there is no other option
cout << m;       // outputs character data ";" because it assumes 8-bits is char data.
                 // This is a consequence of limited ability to overload

// But for wide strings, the behavior is different and better...
unsigned short s = 59;
wcout << s;      // Prints the number "59" like we expect
wchar_t w = L'C'
wcout << w;      // Prints out "C" like we expect

如果引入新的 8 位整数类型,语言会更加一致,这将支持更智能的重载和行为更相似的重载,无论您使用的是窄字符串还是宽字符串。

【问题讨论】:

  • 如果我告诉你 wchar_t 不需要是 16 位,你会不会大吃一惊?或者在一个确定的 CHAR_BIT==8 环境中甚至是 2 个字节?
  • 或者说wchar_t/unsigned short一直是不同的?
  • 我想 wchar_t 有多宽并不重要,关键是,它不能与整数混淆,不像 char。另外,char16_t 和 char32_t 也是。
  • 16 位 wchar_t 听起来像是一个可怕的替代现实..
  • 如果您是从头开始设计语言,不关心向后兼容性,那么使用(一种可能性)类似模板的表示法会有很多话要说,所以你可以有 @ 987654327@ 或 char&lt;N&gt;,其中 N 可以是 8 到至少 64 的 2 的任何幂。只有两个名称,您将提供所有 charshortintlong , 和long long,它会简单且系统化,因此整数和字符类型之间的区别将与大小解耦。还没有发生,并且考虑到向后兼容性的限制,它可能也永远不会发生。

标签: c++ c++11 c++14 wchar-t


【解决方案1】:

是的,可能,但是使用不是字符的单字节整数非常罕见,您可以通过整数提升轻松解决您陈述的问题(尝试应用一元 + 并查看会发生什么)。

还值得注意的是,您的前提是有缺陷的:wchar_tunsigned short 总是是不同的类型,每段 3.9.1/5 在 C++98、C++03、C ++11 和 C++14。

【讨论】:

  • 直到今天我才想将一些字节输出为十六进制,结果发现自己正在查看一个包含笑脸和奇怪字母的文本文件。
  • @NeilKirk:是的,我偶尔会这样。我不认为经常或有足够大的损害来保证一个全新的类型(天哪,你能想象一个新的 byte 关键字的向后兼容性噩梦吗?@ 987654326@ 也许但是 ew,为什么那不是和char 一样,天哪,这太可怕了)……是的,我刚刚在括号中找到了一些原因。除此之外,必须有一个很好的理由来为语言添加一些东西,而不是相反。虽然如果这还没有被提出,我会感到惊讶。关键是,这里没有可回答的问题。
  • 问题是整数类型是模板参数,我想将整数输出到流中。我想我可以在他们身上加上 +,没想到。
  • @NeilKirk:我就是这么做的。不理想,我承认。
  • 感谢您的提示,这对我明天整理一些代码很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-06
  • 2014-05-03
  • 2020-10-08
相关资源
最近更新 更多