C ++ 11数据类型混乱

时间:2017-03-22 09:29:13

标签: c++ c++11 types char int

我正在尝试为C ++数据类型编写一个可靠的摘要,但我对新数据类型有些疑惑。

从我对C ++数据类型的读数中可以理解,char16_tchar_32_t是基础数据类型,是C ++ 11以来核心语言的一部分。

提到它们是不同的数据类型。

Q1:究竟做了什么" distinct"这意味着什么?

Q2:为什么intxx_t类型系列int32_t被选为不是基本数据类型?在选择它们而不是int时,它们如何有益?

4 个答案:

答案 0 :(得分:4)

回答问题的第二部分:

固定大小的整数类型继承自C,它们是typedef s。决定将它们保持为typedef以便兼容。请注意,C语言没有重载功能,因此需要" distinct"那里的类​​型较低。

使用int32_t的一个原因是您需要一个或多个必需属性:

  

有符号整数类型,宽度正好 32位   没有填充位,使用2的补码表示负值。

如果您使用intfor example可能是36位并使用1&#39。补充。

但是,如果您没有非常特定的要求,则使用正常的int将正常工作。一个优点是所有系统都可以使用int,而36位机器(或24位嵌入式处理器)可能根本没有int32_t

答案 1 :(得分:3)

charXX_t中引入了uintXX_t类型。它们是作为char16_t的不同类型创建的,以允许重载:

  

uint_least16_t定义为一种独特的新类型,其大小和表示形式与char32_t相同。同样,将uint_least32_t定义为不同的新类型,其大小和表示形式与char16_t相同。

     

[N1040将char32_tuint_least16_t定义为uint_least32_tisLoggedIn的类型定义,会使这些字符无法重载。]

答案 2 :(得分:1)

表达“不同类型”的另一种方法是您可以为每种类型创建两个重载函数。例如:

typedef int Int;
void f(int) { impl_1; }
void f(Int) { impl_2; }

如果您尝试编译包含两个函数的代码片段,则编译器将抱怨违反ODR:由于它们的参数相同,因此您试图两次重新定义相同的函数。这是因为typedef不会创建类型,只是别名。

但是,当类型真正不同时,两个版本将被编译器视为两个不同的重载。

答案 3 :(得分:0)

回答你的问题:

不同类型意味着std::is_same<char16_t,uint_least16_t>::value等于false

因此可以重载功能。

(但是,大小,签名和对齐没有区别。)