short signed int和signed int之间有什么区别

时间:2010-07-15 08:10:23

标签: c

我在c上引用了一个教程,我找到了签名的int& short signed int范围是-32768到32767,它是2个字节,是它们的任何区别,如果不是那么为什么使用两种声明。

8 个答案:

答案 0 :(得分:9)

这是特定于平台的 - 在此上下文中您可以确定的是sizeof(int) >= sizeof(short) >= 16 bits

答案 1 :(得分:8)

您的问题的最佳答案可以在ANSI的ANSI标准中找到,第2.2.4.2节 - 数值限制。为方便起见,我在这里重现了该部分的相关部分:

  

2.2.4.2数值限制

     

符合要求的实施应   记录中指定的所有限制   本节应予以具体说明   在标题和    

     

“整数类型的大小”

     

以下给出的值应为   由常量表达式替换   适用于#if预处理   指令。其   实现定义的值应为   等于或大于等级   (绝对值)显示的那些,用   同一个标志。

     
      
  • 最小的最大位数   不是位字段的对象(字节)   CHAR_BIT 8

  •   
  • 类型对象的最小值   签名char SCHAR_MIN
      -127

  •   
  • 类型对象的最大值   签名字符SCHAR_MAX
      +127

  •   
  • 类型对象的最大值   unsigned char UCHAR_MAX
      255

  •   
  • 类型对象的最小值   char CHAR_MIN看   在

  • 之下   
  • 类型对象的最大值   char CHAR_MAX见   在

  • 之下   
  • a中的最大字节数   多字节字符,适用于任何支持的字符   区域设置MB_LEN_MAX
      1

  •   
  • 类型对象的最小值   short int SHRT_MIN
      -32767

  •   
  • 类型对象的最大值   short int SHRT_MAX
      +32767

  •   
  • 类型对象的最大值   unsigned short int USHRT_MAX
      65535

  •   
  • 类型对象的最小值   int INT_MIN
      -32767

  •   
  • 类型对象的最大值   int INT_MAX
      +32767

  •   
  • 类型对象的最大值   unsigned int UINT_MAX
      65535

  •   
  • 类型对象的最小值   long int LONG_MIN
      -2147483647

  •   
  • 类型对象的最大值   long int LONG_MAX
      +2147483647

  •   
  • 类型对象的最大值   unsigned long int ULONG_MAX
      4294967295

  •   

未广泛实施的C99添加了以下数字类型:

  
      
  • long long int类型的对象的最小值   LLONG_MIN -9223372036854775807 // - (263 - 1)
  •   
  • long long int类型的对象的最大值   LLONG_MAX +9223372036854775807 // 263 - 1
  •   
  • unsigned long long int类型的对象的最大值   ULLONG_MAX 18446744073709551615 // 264 - 1
  •   

答案 2 :(得分:3)

其他几个答案都正确引用了C标准,该标准在类型上设置了最小范围。但是,如您所见,short intint的最小范围相同 - 所以问题仍然存在:为什么short intint不同?我何时应该选择其中一个?

提供int的原因是提供意图的类型以匹配相关硬件上的“最有效”整数类型(仍满足最低要求范围) )。你应该在C中使用int作为通用的小整数类型 - 它应该是你的默认选择。

如果您知道自己需要的范围超过-32767到32767,则应选择long intlong long int。如果您要存储大量小整数,这样空间效率比计算效率更重要,那么您可以选择short(甚至signed char,如果您知道您的值适合-127到127范围)。

答案 3 :(得分:2)

C和C ++只对其对象进行最小尺寸保证。没有确切的尺寸保证。您不能依赖类型short正好是2个字节,只能它可以保存指定范围内的值(因此它至少是两个字节)。类型int至少与short一样大,通常更大。请注意signed int是一种冗长的方式来说int,而signed short int是一种冗长的方式来说short int,这是一种冗长的说法{{} 1}}。除了类型short(某些编译器将使其无符号)之外,默认情况下会对所有内置整数类型进行签名。类型charshort int分别是long intshort的较长方式。

答案 4 :(得分:1)

signed int至少与short signed int一样大。在大多数现代硬件上,short int是2个字节(如您所见),常规int是4个字节。较旧的体系结构通常有一个2字节int,这可能是导致您混淆的原因。

还有一个long int,通常是4或8个字节,具体取决于编译器。

答案 5 :(得分:1)

请阅读以下有关签名字符的填写,然后我们将讨论签名/未签名的int。

首先,我想为您的问题准备背景。
................................................ />

char数据类型有两种类型:

unsigned char;

签名char;

(即INTEGRAL DATATYPES)

............................................... ..

根据不同的书籍发布: char 1byte -128到127(即默认签名字符)

签名char 1byte -128到127

unsigned char 1byte 0 to 255

............................................... ..

还有1byte = 8位。(0到7位)

由于处理器标志寄存器保留第7位用于表示符号(即1 = + ve& 0 = -ve)


-37将表示为1101 1011(最高有效位为1),

+37将表示为0010 0101(最高有效位为0)。


............................................... ..

同样,对于char,最后一位默认为签名


这就是为什么?

因为char还依赖于特定字符的ASCII码(例如,A = 65)。


在任何情况下,我们都使用char并仅使用7位。

在这种情况下,为了将char / int的内存范围增加1位,我们使用unsigned char或unsigned int;

感谢您提出问题。

同样对于4bit int或2bit int我们需要签名int& unsigned int

答案 6 :(得分:0)

这取决于平台。

在32位系统上Int为32位宽,在64位系统上为64位宽(我确信情况确实如此)。

答案 7 :(得分:0)

  

我在c上引用了一个教程,我找到了签名的int& short signed int范围是-32768到32767,它是2个字节。

这是一个非常古老的教程。根据Paul R的回答,现代C标准。在32位架构上,通常是:

    short int is 16 bits
          int is 32 bits
     long int is 32 bits
long long int is 64 bits

在16位机器上,int的大小通常只有16位。如今,16位机器可能仅限于嵌入式设备。

在16位机器上,尺寸可能是这样的:

    short int is 16 bits
          int is 16 bits
     long int is 32 bits
long long int is 64 bits