Menu Close

什么是整形变量?

整型变量(整数变量)是数值可以改变的整数类型的变量。在C语言中,整型变量的值可以是十进制,八进制,十六进制,但在内存中存储着是二进制数。

1.整数类型

整形数据在内存中的存放形式:

%title插图%num

 

 

1)基本型:类型说明符为 int,在内存中占 2 个字节。(有的编译器是四节,code:block编译器整形变量是四节)
2) 短整型:类型说明符为 short int 或 short。在内存中占 2 个字节
3) 长整型:类型说明符为 long int 或 long,在内存中占 4 个字节
4)无符号型:类型说明符为 unsigned。

无符号型又可与上述三种类型匹配而构成

  • 无符号基本型:类型说明符为 unsigned int 或 unsigned
  •  无符号短整型:类型说明符为 unsigned short
  • 无符号长整型:类型说明符为 unsigned long。

各种无符号类型量所占的内存空间字节数与相应的有符号类型量相同。但由于省去了符号位,故不能表示负数。

%title插图%num

下表列出了关于标准整数类型的存储大小和值范围的细节:

类型 存储大小 值范围
char 1 字节 -128 到 127
unsigned char 1 字节 0 到 255
signed char 1 字节 -128 到 127
int 2 或 4 字节 -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647
unsigned int 2 或 4 字节 0 到 65,535 或 0 到 4,294,967,295
short 2 字节 -32,768 到 32,767
unsigned short 2 字节 0 到 65,535
long 4 字节 -2,147,483,648 到 2,147,483,647
unsigned long 4 字节 0 到 4,294,967,295

注意,各种类型的存储大小与系统位数有关,但目前通用的以64位系统为主。

以正数13为例,列出存储空间分配(以16位cpu 为例)

%title插图%num

2. 整型变量的定义

变量定义的一般形式为:

类型说明符  变量名标识符,变量名标识符,…;

int a , b, c;
long x, y, z;

在书写变量定义时,应注意以下几点:

  • 类型说明符和变量定义之间,至少需要一个空格;
  • 组合类型说明符(例如:unsigned int)之间,至少需要一个空格;
  • 允许在一个类型说明符后定义多个变量;变量之间需要使用1个“,” 分开;
  • 最后一个变量名之后必须以“;”号结尾;
  • 变量声明必须放在变量使用之前。一般放在函数体或文件的开头部分。

为了得到某个类型或某个变量在特定平台上的准确大小,可以使用 sizeof 运算符。表达式 sizeof(type) 得到对象或类型的存储字节大小,这里的type 是指类型说明符。

例1 . Code Block 在x86下,各类整形变量的字节大小:

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <float.h>
 
int main()
{
    printf("size of int : %d\n",sizeof(int));
    printf("size of char : %d\n",sizeof(char));
    printf("size of signed char : %d\n",sizeof(signed char));
    printf("size of unsigned char : %d\n",sizeof(unsigned char));
    printf("size of short : %d\n",sizeof(short));
    printf("size of short int : %d\n",sizeof(short int));
    printf("size of signed short  : %d\n",sizeof(signed short));
    printf("size of signed short int  : %d\n",sizeof(signed short int));
    printf("size of long int : %d\n",sizeof( long int));
    printf("size of float : %d\n",sizeof(float));
    printf("size of double : %d\n",sizeof(double));
    printf("size of long double : %d\n",sizeof(long double));
 
    return 0;
}

%d,d 是 decimal 的缩写,意思是十进制数,%d 表示以十进制整数的形式输出

%d称为格式控制符(占位符),它指明了以何种形式输出数据。格式控制符均以%开头,后跟其他字符。

%d:表示以十进制形式输出一个整数
%c:输出一个字符。c 是 character 的简写
%s:输出一个字符串。s 是 string 的简写
%f:输出一个小数。f 是 float 的简写

 

%title插图%num

 

stdlib.h里面定义了五种类型、一些宏和通用工具函数。

下面给出的示例示范程序利用limits.h头文件中定义的不同常量,可以获取计算机上各种数据类型的大小-

例二:各种整形变量的范围:

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <float.h>
 
int main(int argc, char** argv) {
 
    printf("CHAR_BIT    :   %d\n", CHAR_BIT);
    printf("CHAR_MAX    :   %d\n", CHAR_MAX);
    printf("CHAR_MIN    :   %d\n", CHAR_MIN);
    printf("INT_MAX     :   %d\n", INT_MAX);
    printf("INT_MIN     :   %d\n", INT_MIN);
    printf("LONG_MAX    :   %ld\n", (long) LONG_MAX);
    printf("LONG_MIN    :   %ld\n", (long) LONG_MIN);
    printf("SCHAR_MAX   :   %d\n", SCHAR_MAX);
    printf("SCHAR_MIN   :   %d\n", SCHAR_MIN);
    printf("SHRT_MAX    :   %d\n", SHRT_MAX);
    printf("SHRT_MIN    :   %d\n", SHRT_MIN);
    printf("UCHAR_MAX   :   %d\n", UCHAR_MAX);
    printf("UINT_MAX    :   %u\n", (unsigned int) UINT_MAX);
    printf("ULONG_MAX   :   %lu\n", (unsigned long) ULONG_MAX);
    printf("USHRT_MAX   :   %d\n", (unsigned short) USHRT_MAX);
 
    return 0;
}

结果:

 

%title插图%num

例三: 下面示例示范程序是如何储存char和整数的。

include <stdio.h> 
int main() 
{ 
    char a = 278; 
    printf("%d", a); 
   
    return 0; 
}

运行结果:
%title插图%num

原因: 首先,编译器在内部将278从十进制数系统转换为二进制数系统(100010110),然后仅考虑该数字右边以二进制表示的前8位,并将此值存储在变量a中。 它还会发出溢出警告。(如何将十进制278转换为二进制(100010110),请看本页下面注释。

%title插图%num

00010110对应的十进制数是22. (计算方法简单,该位置的值乘于对应位置的2次方相加)

例四:下面示例示范程序是如何储存char和整数的

#include <stdio.h> 
int main() 
{ 
    char a = -129; 
    printf("%d", a); 
   
    return 0; 
} 

结果

%title插图%num

首先,应该理解,负数以2的补码形式存储。

编译器在内部将129从十进制系统转换为二进制系统(10000001),然后将所有零都更改为1,将1全都更改为零(即做一个补码)(01111110),然后将1添加到一个补码中.

通过二进制加法得到该数字的二进制补码(01111111)。

现在,将取最右边的8位,并将其原样存储在变量a中。 它还会发出溢出警告。

下图是应该熟记的二进制和十进制转换表

%title插图%num

 

例五:整形变量的运算

main()
{
      int a, b;
      a=32767;
      b=a+1;
      printf("%d, %d\n",a,b);
 }

 

%title插图%num

在code:block编译器内,整形变量范围(分配空间)不是两节,应该是四节。

例六:整形变量的溢出

main()
{
    int a, b;
    a=2147483647;
    b=a+1;
    printf("%d, %d\n",a,b);
 }

 

%title插图%num

原因是32个bits中有31个1,加1后符号位是1,其余全是0。实际上是溢出了。

0x7ffff_ffff_ffff_ffff + 1 = 0x8000_0000_0000_0000

Posted in C语言

发表评论

相关链接