C 整数类型

学习C - C 整数类型

带符号的整数类型

我们有五种基本类型的变量来存储带符号的整数值,因此可以存储正值和负值。

每种类型由不同的关键字或关键字的组合指定,如下表所示。

类型名称字节数
signed char1
short2
int4
long4
long long8

以下是这些类型的变量的一些声明:

short shoe_size; 
int house_number; 
long long star_count;

类型名称short,long和long long可以写成short int,long int和long long int,并且可以选择性地在前面签署关键字。

但是,这些类型几乎总是以缩写形式写成,如上表所示。

类型int也可以写为signed int。

您可以存储的值范围取决于您使用的特定编译器。

例子


#include <stdio.h> 
int main(void) 
{ 
      int ten = 10; 
      int two = 2; 
             
      printf("%d minus %d is %d\n", ten, 2, ten - two ); 
   
      return 0; 
}    

上面的代码生成以下结果。


无符号整数类型

一些数据总是正的。

对于这些数据,您不需要提供负值。

对于每个有符号整数,存在相应的无符号类型整数,无符号类型与签名类型占用相同的内存量。

每个未签名的类型名称是带有关键字unsigned的前缀的带符号类型名称。

下表显示了可以使用的无符号整数类型的基本集合。

类型名称字节数
unsigned char1
unsigned short 或 unsigned short int2
unsigned int4
unsigned long 或 unsigned long int4
unsigned long long 或 unsigned long long int8

使用给定的位数,可以表示的不同值的数量是固定的。

例如,32位整数变量可以存储4,294,967,296个不同的值。

使用无符号类型不会提供比对应的签名类型更多的值。

以下是无符号整数变量声明的示例:

unsigned int count; 
unsigned long population; 

以下代码显示如何声明unsigned int。


#include <stdio.h> 
int main(void) 
{ 
   unsigned int iResponse = 0; 
   printf("%d", iResponse); 
   
   return 0;
} 

上面的代码生成以下结果。

整数常量

因为你可以有不同类型的整数变量,所以我们有不同类型的整数常量。

例如,如果你只写整数值100,那将是int类型。

如果你想确定它是长类型,你必须在数值中附加一个大写或小写的字母L.

所以100作为一个长的值写为100L。

要声明和初始化变量my_value,您可以这样写:

long my_value = 123456789L;

您使用负号写负整数常量,例如:

int decrease = -4; 
long  my_value = -100000L;

您可以通过添加两个L来指定整数常量为long long类型:

long long my_value = 123456789LL;

要将常数指定为无符号类型,请附加一个U,如以下示例所示:

unsigned int count = 100U; 
unsigned long value = 999999999UL; 

要存储最大幅度的整数,您可以定义如下变量:

unsigned long long my_value = 9876543212345678ULL;

ULL指定初始值为unsigned long long类型。

十六进制常量

您可以以十六进制形式编写整数值,这是16位。

十六进制数字的数字相当于十进制值0到15,它们由0到9和A表示为F(或a到f)。

十六进制数字用前缀 0x 0X 写入。

十六进制常数可以有一个后缀。

以下是十六进制常量的一些示例:

0xFFFF
0x123456EE
0xFABABULL

八进制常数

一个八进制值是一个基数8。

每个八进制数字具有从0到7的值,其对应于二进制的三位。

以零开始的整数常数(如014)将被解释为八进制数。

014是十进制值12的八进制等效值。

以下代码以十进制,八进制和十六进制打印100。

 
#include <stdio.h> 
int main(void) 
{ 
    int x = 100; 
 
    printf("dec = %d; octal = %o; hex = %x\n", x, x, x); 
    printf("dec = %d; octal = %#o; hex = %#x\n", x, x, x); 
 
    return 0; 
}   

上面的代码生成以下结果。

整数溢出

如果一个整数尝试为其类型变得太大,会发生什么?

让我们设置一个整数到它最大的可能值,添加它。

尝试使用带符号和无符号类型。

printf()函数使用%u说明符来显示unsigned int值。


#include <stdio.h> 
#define PAGES 959 
int main(void) { 
   int i = 2147483647; 
   unsigned int j = 4294967295; 
                 
   printf("%d %d %d\n", i, i+1, i+2); 
   printf("%u %u %u\n", j, j+1, j+2); 


   printf("*%d*\n", PAGES); 
   printf("*%2d*\n", PAGES); 
   printf("*%10d*\n", PAGES); 
   printf("*%-10d*\n", PAGES); 
   return 0; 
}    

整数无符号int变量j(如里程表)从0开始,但int变量i始于-2147483648。

上面的代码生成以下结果。

例2

以下代码使用整数类型的便携式名称。


#include <stdio.h> 
#include <inttypes.h> // supports portable types 
int main(void) 
  { 
      int32_t me32;     // me32 a 32-bit signed variable 
   
      me32 = 45933945; 
      printf("First, assume int32_t is int: "); 
      printf("me32 = %d\n", me32); 
      printf("Next, let"s not make any assumptions.\n"); 
      printf("Instead, use a \"macro\" from inttypes.h: "); 
      printf("me32 = %" PRId32 "\n", me32); 
   
      return 0; 
  }    

上面的代码生成以下结果。