C 整数类型
学习C - C 整数类型
带符号的整数类型
我们有五种基本类型的变量来存储带符号的整数值,因此可以存储正值和负值。
每种类型由不同的关键字或关键字的组合指定,如下表所示。
类型名称 | 字节数 |
---|---|
signed char | 1 |
short | 2 |
int | 4 |
long | 4 |
long long | 8 |
以下是这些类型的变量的一些声明:
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 char | 1 |
unsigned short 或 unsigned short int | 2 |
unsigned int | 4 |
unsigned long 或 unsigned long int | 4 |
unsigned long long 或 unsigned long long int | 8 |
使用给定的位数,可以表示的不同值的数量是固定的。
例如,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;
}
上面的代码生成以下结果。