繁体   English   中英

在C语言中,如何确定两种类型是否相同?

[英]In C how is it determined if two types are identical?

http://publib.boulder.ibm.com/infocenter/comphelp/v7v91/index.jsp?topic=/com.ibm.vacpp7a.doc/language/ref/clrc03compatible_types.htm

用于算术类型的各种说明中的类型说明符的存在可能会或可能不会指示不同的类型。 例如,除了用作位字段的类型外,带符号的int类型与int相同。 但是char,signed char和unsigned char是不同的类型。

在类型标识方面,int和char之间存在这种差异的原因是什么?

我想同样的规则也适用于C ++。 因此,在这个问题上也添加了c ++标签

从C ++ 11 :(第3.9节各段的摘录)

普通字符,有符号字符和无符号字符是三种不同的类型,统称为窄字符类型。

有五种标准的带符号整数类型:“有符号字符”,“ short int”,“ int”,“ long int”和“ long long int”。
对于每种标准有符号整数类型,都存在一个对应的(但不同的)标准无符号标准

整数类型:“ unsigned char”,“ unsigned short int”,“ unsigned int”,“ unsigned long int”和“ unsigned long long int”,它们各自占用相同的存储空间并具有相同的对齐要求(3.11 )作为对应的有符号整数类型47;

wchar_t类型是不同类型... char16_t和char32_t类型表示不同类型...

布尔类型的值是true或false。49[注意:没有带符号,无符号,短或长布尔类型或值。 —尾注]

第7.1.6.2节列出了一个表,这些表列出了哪些类型的关键字:

type-name          the type named
simple-template-id the type as defined in 14.2
char               “char”
unsigned char      “unsigned char”
signed char        “signed char”
char16_t           “char16_t”
char32_t           “char32_t”
bool               “bool”
unsigned           “unsigned int”
unsigned int       “unsigned int”
signed             “int”
signed int         “int”
int                “int”
unsigned short int “unsigned short int”
unsigned short     “unsigned short int”
unsigned long int  “unsigned long int”
unsigned long      “unsigned long int”
unsigned long long int “unsigned long long int”
unsigned long long “unsigned long long int”
signed long int    “long int”
signed long        “long int”
signed long long int “long long int”
signed long long   “long long int”
long long int      “long long int”
long long          “long long int”
long int           “long int”
long               “long int”
signed short int   “short int”
signed short       “short int”
short int          “short int”
short              “short int”
wchar_t            “wchar_t”
float              “float”
double             “double”
long double        “long double”
void               “void”
auto               placeholder for a type to be deduced
decltype(expression) the type as defined below

至于为什么char变得更奇怪,我被告知,原来,有一些编译器使char无符号的(在构想unsigned类型之前?)。 C ++标准希望对此进行纠正,但又不想破坏现有的代码,因此他们定义了char实现的signed char ,并将signed char作为单独的类型添加。

最初,C没有unsigned类型,因此默认情况下char是带符号的。 由于PDP-11使用8位字节和ASCII字符集,因此char对象不应采用负值

从ASCII字符集中选择字符(已声明,以下称为char )。 它们占据8位字节的最右边的7位。 也可以将char解释为带符号的2的补码8位数字。

在1977年左右增加了 unsigned类型,部分是为了阻止将指针用于无符号算术:

字符指针和无符号整数的算术特性的相似性使得难以抵御标识它们的诱惑。 添加了无符号类型,以使无符号算术可用,而不会与指针操作混淆。

使用char签名的问题在于,为了对char值执行算术运算,必须对它们进行符号扩展 这在具有SXT指令的PDP-11上非常有效,但在ARM上没有 (至少直到1996年发布了ARM体系结构的第4版之前):

[...]在ARM指令集中找不到单个“从内存加载字符并扩展符号”。 这就是为什么出于性能原因,我知道的每个编译器都将默认的char类型设置为在x86上签名,而在ARM上却未签名。 [...]

因此,当C标准化时,委员会可以选择要么使char签名-从而迫使ARM实现更改为低效率-要么反映现有做法并定义char实现的签名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM