"signed"关键字的实际用途是什么?

Eri*_*k W 57 c++

我知道无符号整数只是正数(和0),并且与普通int相比可以加倍.两者之间有什么区别吗?

int variable = 12;
Run Code Online (Sandbox Code Playgroud)

和:

signed int variable = 12;
Run Code Online (Sandbox Code Playgroud)

您何时以及为何使用signed关键字?

CB *_*ley 90

只有一个实例可能需要使用signed关键字.signed char始终是与"plain"不同的类型,char根据实现,它可以是有符号或无符号类型.

C++ 14 3.9.1/1说:

实现定义char对象是否可以保存负值.可以显式声明字符unsignedsigned.平原char,signed char并且unsigned char是三种不同的类型[...]

在其他情况下signed是多余的.


在C++ 14(和C)之前,还有第二个实例:位字段.它是实现定义的,例如,int x:2;(在类的声明中)是否与它相同unsigned int x:2;或相同signed int x:2.

C++ 11 9.6/3说:

它是实现定义是否一个普通的(既没有明确签署也没有无符号)char,short,int,long,或long long位域带符号.

但是,由于C++ 14已经改变了,所以int x:2;总是意味着signed int.链接到讨论

  • @CharlesBailey第二个已经改变了.给定`template <typename T> struct S;`,`S <int>`和`S <signed int>`是相同的类型.它们必须保持相同的类型,即使`S`最终被定义为`template <typename T> struct S {T bitfield:4; 因此,实现定义的位字段的签名是不可行的.有人建议将实现定义的签名限制为具有非依赖类型的位字段,但这从未使其成为标准.最后,只删除了将这些位字段视为无符号的权限.请参阅CWG问题675和739. (5认同)
  • 并注意到,历史上,基于PowerPC的编译器默认将`char`视为`unsigned`,而x86和ARM则将其视为`signed`. (4认同)

Win*_*ute 8

在这种情况下int,没有区别.它只会产生影响char,因为

  1. 它没有定义char是签名还是未签名,以及
  2. char,signed charunsigned char,无论如何是三种不同的类型.

因此,signed如果您需要signed char(可能很少),您应该使用.除此之外,我想不出一个理由.

  • 禁止编译器势利我刚刚提到devstudio,因为我确信它确实如此.我不确定gcc所以我没有提到它.此外,GCC并不比开发工作室更值得注意.当你认为Windows仍然拥有世界上最大的安装基础时,很容易看到dev studio,因此visual C++有很多用户(和GCC一样).也就是说,也许"包括"这个词会让我的观点更好,而不是"显着". (2认同)
  • @hvanbrug:你的意思是Visual Studio?(这是一个IDE,而不是编译器.而且它的C++编译器直到最近才特别关注标准.)或者Anjuta DevStudio(另一个IDE)?如果你真的是指一个名为"devstudio"的编译器,那么我担心它根本不值得注意,因为基本上没有人听说过它. (2认同)