默认情况下,什么决定整数类型是烧结还是无符号?

时间:2018-01-26 11:21:04

标签: c++ integer unsigned signed

  

bool和扩展字符类型外,还有整数类型   可能签名或未签名(34页。 C ++ Primer 5ed)

"可能是" ,让我感到困惑,但是,请不要提供answer,我不要问区别例如,当您在声明中明确写下它们时,intunsigned int。我想知道类型char, short, int, long, long long在什么条件下被烧焦或未签名

我在我的Mac上编写了一个简单的测试代码,并由GNU编译器编译,它告诉我char已被烧焦

#include <iostream>
#include <limits>
using namespace std;

int main( int argc, char * argv[] )
{
    int minChar = numeric_limits<char>::min(); 
    int maxChar = numeric_limits<char>::max(); 


    cout << minChar << endl; // prints -128
    cout << maxChar << endl; // prints 127
    return 0;
}

同样的机制适用于所有可签名的整数类型,结果如下所示。

minOfChar: -128
maxOfChar: 127
minOfShort: -32768
maxOfShort: 32767
minOfInt: -2147483648
maxOfInt: 2147483647
minOfLong: 0    // This is interesting, 0
maxOfLong: -1   // and -1  :p
minOfLongLong: 0 // shouldn't use int to hold max/min of long/long long #Bathsheba answered below
maxOfLongLong: -1 // I'll live this error unfixed, that's a stupid pitiful for newbies like me, also good for leaning :)

结果告诉我,对于在Mac上由g ++编译的char, short, int, long, long long,默认情况下是整数。

所以问题正如标题所示:

什么决定整数类型是烧焦的还是未签名的

1 个答案:

答案 0 :(得分:3)

除了char之外,整数类型的签名在C和C ++标准中明确指定,或者通过类型需要实现的范围的简单推论来指定。

char的签名由C和C ++的特定实现决定;即它通常由编译器决定。并且将做出最佳选择以适应硬件。

请注意,charsigned charunsigned char都是不同的类型,与int和{{1}的方式非常相似即使它们具有相同的大小和补充方案,它们也是不同的类型。

例如,分配

也不是一个特别好的主意
long

numeric_limits<long>::min(); 值,其行为可能未定义。为什么不使用

int

代替?