C核心技术手册(十四)

整数类型

有五种带符号整数类型,其中多数可以由几个近义词指定,如下表Table 2-1

Table 2-1. Standard signed integer types

  

类型

同义词

Signed char

 

Int

Signed,signed int

Short

Short int, signed short,signed short int

Long

Long int, signed long, signed long int

Long long (C99)

Long long int, signed long long, signed long long int

 

对于表Table 2-1中每一个有符号整形类型,存在个相应的占据同样大小内存的无符号类型,换句话说,如果编译器排列signed int对象在偶数字节的地址,那么unsigned int 对象也排列在偶数地址,这些无符号类型可参见下表Table 2-2.

Table 2-2. Unsigned standard integer types

类型

同义词

_Bool

Bool(define in stdbool.h)

Unsigned char

 

Unsigned int

Unsigned

Unsigned short

Unsigned short int

Unsigned long

Unsigned long int

Unsigned long long

Unsigned long long int

  C99引入无符号整形_Bool 来表示布尔值,其中true1false0,如果你在程序中包含了头文件stdbool.h,那么你也可以使用标识符bool, truefalse.这些对c++程序员来说很熟悉,宏bool _Bool类型的同义词,turefalse为常量10的象征符号。

  Char类型也是整形的一种,但是,一个词的char类型有可能与signed char等价,也有可能与unsigned char相同,这取决于编译器,因为这在执行时才会被选择,char, signed charunsigned char是形式上不同的三种类型。

   注:如果你的程序使用char且取值小于0或大于127,你应该使用signed charunsigned char来代替。

  你可以使用字符变量为编写算法,这取决于你的程序将char变量的值看做字符编码还是其他,例如,下面的代码段中视ch中的char值既为整形,又为一个字符,只是在不同的时刻:


printf()语句中,ch第一次被视为一个字符,且它的值被打印出来,接着打印出它的数值,同样地,在for循环中,指令++ch中,ch被视做整数,在函数printf()中又被看做字符,在系统中使用的是7-bitASCII编码,或者它的扩展,这段代码产生如下输出:



 Char类型通常占用一个字节,换句话说,sizeof(char)通常等于1,且至少是8位的宽度,基本字符集中的每一个字符均可使用一个char对象来表示其值。

  C仅定义其他类型的最小取值,short类型至少两个字节,long至少四个字节,long long至少八个字节,此外,虽然整形可能大于它的最小取值,大小必须遵循下面的顺序:

  sizeof(short) sizeof(int) sizeof(long) sizeof(long long)

int 类型是最适合目标系统的整数类型,与CPU寄存器的大小和位格式相适应。

  整型的内部表示为二进制,有符号类型可能会使用符号和大小来表示,当做1的补码,或2的补码,最常用的是2的补码,带有符号的非负数的值取值在无符号类型的范围之内,同样,一个非负数的值也使用二进制表示,Table 2-3为对于有符号和无符号整型的位域表示。

 

 

 

Table 2-3. Binary representations of signed and unsigned 16-bit integers

  二进制

无符号十进制整型

有符号十进制整型(1补码)

有符号十进制整型(2的补码)

00000000 00000000

0

0

0

00000000 00000001

1

1

1

00000000 00000010

2

2

2

 

 

 

01111111 11111111

32,767

32,767

32,767

10000000 00000000

32,768

-32,767

-32,768

10000000 00000011

32769

-32,766

-32,767

 

 

 

11111111 11111110

65,534

-1

-2

11111111 11111111

65,535

-0

-1

 

Table 2-4列出标准整型的大小和取值范围

Table 2-4. Common storage sizes and value ranges of standard integer types

 

  类型

存储大小

最小值

最大值

Char

 (same as either signed char or unsigned char)

Unsigned char

One byte

0

255

Signed char

One byte

-128

127

Int

Two bytes or four bytes

-32,768 or -2,147,483,648

32,767 or 2,147,483,647

Unsigned int

Two bytes or four bytes

0

65,535 or 2,147,483,647

Short

Two bytes

-32,768

32,768

Unsigned short

Two bytes

0

65535

Long

Four bytes

-2,147,483,648

2,147,483,647

Unsigned long

Four bytes

0

4,294,967,295

Long long(C99)

Eight bytes

-9,223,372,036, 854,775,808

9,223,372,036, 854,775,807

Unsigned long long (C99)

Eight bytes

0

18,446,744,073, 709,551,615

 

  下面的例子中,int型变量iIndexiLimit32位机器上占据4个字节:

    int iIndex,            // Define two int variables and
    iLimit = 1000;     // initialize the second one.

  要获得一个类型或变量的占用的空间大小,可以使用sizeof操作符,表达式sizeof(type) sizeof expression会计算出类型或对象的字节数,如果操作数是个表达式,那么计算出的大小将是此表达式类型的大小,在前面的例子中,sizeof(int)sizeof(iIndex)的大小相同,均为4,iIndex两边的圆括号可以忽略。

  你可以在头文件limits.h中找到你的C编译器中整型的范围,它们以宏的形式定义,如INT_MIN, INT_MAX,UINT_MAX等等。下面的例子Example 2-1中使用这些宏来显示charint的最小值和最大值。

Example 2-1. Value ranges of the types char and int

在整型的算法中,有可能发现溢出,当一个操作的结果不在类型的取值范围中时就会生溢出,在无符号整型的算法中,溢出被忽略,在数学术语中,一个无符号整型操作的有效结果等于它的值除以UTYPE_MAX+1的余数,这里的UTYPE_MAX为此无符号类型的最大取值,例如,下面的例子将会使变量的值溢出:

      unsigned int ui = UINT_MAX;
      ui += 2;                       // Result: 1

  C中仅提出了无符号整型的溢出现象,对于其他类型,溢出的结果是没有定义的,例如,溢出可能会被忽略,或者可能抛出一个信号,如果没有被扑获,将使用程序Abort.

 

原文链接: https://www.cnblogs.com/dyx1024/archive/2010/12/08/2556794.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    C核心技术手册(十四)

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/18549

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月7日 下午7:21
下一篇 2023年2月7日 下午7:21

相关推荐