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

Pub*_*bby 6 c c++ keyword

每次我使用unsigned过之前的关键字int或其他内置类型.我想知道是否还有其他方法unsigned可以使用.

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

如果没有,为什么它有自己的关键字?为什么unsigned intuint呢?

Kei*_*son 5

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

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

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

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

注意缺少了什么:没有signedunsigned关键字,没有short,longlong double; 所有这些都是后来添加的.(程序员需要无符号算术常用指针,可以自由地与之互换int.)

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

当稍后添加其他类型时,有意义的是添加诸如unsigned,shortlong现有类型名称之类的说明符,而不是引入新的关键字(可能已经破坏了现有代码).当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


Car*_*ory 4

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