unsigned关键字可以以非显而易见的方式使用吗?

时间:2011-10-12 17:00:55

标签: c++ c keyword

我每次使用unsigned关键字时都会使用int或其他内置类型。 我想知道是否还有其他方式unsigned可以使用。

  • 用户定义的类型(类/结构)是否可以使用unsigned关键字?
  • 模板是否可以与unsigned一起使用?

如果没有,为什么它有自己的关键字?为什么unsigned int不是uint

6 个答案:

答案 0 :(得分:5)

主要问题已经多次回答:unsigned关键字只能用作整数类型的类型说明符。

至于为什么unsigned是一个单独的关键字,而不是拥有uint个关键字,原因就是历史。

最早版本的C(pre-K& R)只有四种基本类型:

  • char(8位,有符号,2位补码)
  • int(16位,有符号,2位补码)
  • float(32位)
  • double(64位,与float相同,但精度更高)

请注意缺少的内容:没有signedunsigned个关键字,没有shortlonglong double;所有这些都是后来添加的。 (程序员需要无符号算术常用指针,可以与int自由互换。)

每个基本类型的名称都是一个关键字,这使得语法很简单。

在以后添加其他类型时,将unsignedshortlong等说明符添加到现有类型名称而不是引入新关键字(可能已经破坏)是有意义的现有代码)。当ANSI C委员会在1989年对语言进行标准化时,他们必须从现有的非正式定义中建立一个连贯的结构,同时保持与现有实现的一致性。结果就是我们现在所拥有的,int long unsigned long是一个有效的类型名称(更常见的是unsigned long long)。

如果现在从头开始设计语言,我怀疑会采取不同的方法。也许每个基本类型都会有一个关键字(例如,这是C#所采用的方法),或者基本类型名称可能会使用一些更连贯的方案而不是混乱的关键字(比如,int:2 2字节整数,unsigned:4表示4字节无符号整数。但C和C ++都坚持当前的方法。

参考:http://cm.bell-labs.com/cm/cs/who/dmr/cman.pdf

答案 1 :(得分:4)

不,它不能与类或结构一起使用,因为它们不是整数类型。所有模板都能用它做一个无符号的int。我认为它被选为一个单独的关键字,因为它可以应用于任何整数类型(char,int,long,long long),从而实现一个关键字所需要的四个以上。它的意义也很明显,而uint,uchar等不一定。请记住,它也可以在没有限定符的情况下单独使用,在这种情况下,假定使用unsigned int。

答案 2 :(得分:3)

unsigned是一个关键字。 unsigned只能用于整数类型。 unsignedsigned被视为类型说明符,简单类型说明符。因此,他们指定该类型将通过签名或未签名。

您可以typedef unsigned int个字uint,但是当int是类型且unsignedunsigned时,这会使其看起来像一个类型类型说明符本身。

您可以单独使用int unsigned i; ,与普遍看法相反,如C ++ ISO标准第7.1.5.2节表7所示:

enter image description here

您可以使用多个类型说明符(仅当允许时),并且可以按任何顺序与decl-specifiers自由混合。

你也可以这样做:

{{1}}

这是有效的C ++。

答案 3 :(得分:2)

没有unsigned实际上不是一个关键字;它只是int,short,char的修饰符。

unsigned关键字可用作intshortcharlong的修饰符。它也可以单独用作类型名称; unsigned表示unsigned int

这样做是为了避免使用三个额外的关键字uint ushort uchar,因为在C和Unix所针对的所有早期计算机上签名/未签名可能没有不同。

答案 4 :(得分:1)

关键字signed,unsigned,short和long是类型修饰符/说明符,当这些类型修饰符/说明符中的一个本身使用时,假定数据类型为int。

所以signed和unsigned也可能是used as standalone type specifiers,分别与signed int和unsigned int相同。以下两个声明是等效的:

unsigned abc;

unsigned int abc;

答案 5 :(得分:0)

还有unsigned char。一些编译器,比如GNU的g ++,让你只是放置unsigned并假设你的意思是unsigned int。例如,以下代码是等效的

unsigned int x;

unsigned x;