C语言入门系列:数据类型之整数

一,简介

整数类型用来表示整数,类型声明使用int关键字。

int num;

上面示例声明了一个整数变量num。

根据C语言标准,int类型至少要有16位(即至少能表示-32767到32767之间的整数)。

大多数现代计算机上,int通常是32位的,不过16位或64位也有可能使用,这种灵活性会导致程序在不同计算机间移植时的兼容性问题。

下面是三种不同位数的整数可以表示的范围。

16位:-32,768 到 32,767。(速记:3万)
32位:-2,147,483,648 到 2,147,483,647。(速记:21亿)
64位:-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。(速记:900兆,一兆等于一亿亿)

从上可以看出,在64位int计算机上运行的程序,移植到16位int的计算机上,可能出现数据溢出,导致程序运行异常。

在这里插入图片描述

怎么解决整形宽度不固定的问题呢?可以先思考下,后续会给出解决方案。

还有,C语言标准为什么不固定整形宽度呢,比如像Java一样,把整形固定为32位?

二,整数的符号

C 语言的整数分为有符号整数无符号整数

  • 有符号整数,使用signed关键字,表示一个类型是有符号的,包含负值。
  • 无符号整数,使用unsigned关键字,表示该类型是无符号的,只能表示零和正整数。

1,有符号整数

C语言标准规定,int类型默认是有符号的,int等同于signed int,为了间接,关键字signed可以省略不写,或者省略int,用signed表示int。

signed int a;
// 等同于
int a;
// 等同于
signed a;

2,无符号整数

无符号只表示非负整数,定义这类整数时,必须使用关键字unsigned。

unsigned int a;

整数变量声明为unsigned的好处是,同样长度的内存能够表示的最大整数值,增大了一倍。

比如,16位的signed int最大值为32,767,而unsigned int的最大值增大到了65,535。

unsigned int里面的int可以省略,所以上面的变量声明也可以写成下面这样。

unsigned a;

3,char表示整数的特殊性

字符类型char在内存中的宽度是8位,可以用来表示较小范围的整数,也可以设置signed和unsigned。

signed char c; // 范围为 -128 到 127
unsigned char c; // 范围为 0 到 255

注意,C语言标准规定int类型默认是有符号的,但char类型表示整数时无此规定,不同计算机可能有不同实现。这就是说,char可能是signed char,也有可能是unsigned char。

所以在用char存储整数时,一般要明确指定是否有符号。

三,整数的子类型

如果int类型使用4个或8个字节表示一个整数,对于小整数,这样做很浪费空间。

另一方面,某些场合需要更大的整数,8个字节还不够。

为了解决这些问题,C 语言在int类型之外,又提供了三个整数的子类型。

1,三种子类型

子类型有利于更精细地限定整数变量的范围,也有利于更好地表达代码的意图。

  • ① short int(简写为short):占用空间不多于int,一般占用2个字节(整数范围为-32768~32767)。
  • ② long int(简写为long):占用空间不少于int,至少为4个字节。
  • ③ long long int(简写为long long):占用空间多于long,至少为8个字节。
short int a;
long int b;
long long int c;

上面代码分别声明了三种整数子类型的变量。

默认情况下,short、long、long long都是带符号的(signed),即signed关键字省略了。

它们也可以声明为不带符号(unsigned),使得能够表示的最大值扩大一倍。

unsigned short int a;
unsigned long int b;
unsigned long long int c;

C 语言允许省略int,所以变量声明语句也可以写成下面这样。

short a;
unsigned short a;

long b;
unsigned long b;

long long c;
unsigned long long c;

2,定义整形的最佳实践

由于C语言标准没有确定整数类型的字节大小,所以在使用时应该根据实际情况进行评估,选择合适的类型,既保证数据类型的安全性即不溢出,又不浪费空间。

  • 需要32位整数时,应使用long类型,可以确保不少于4个字节。
  • 需要64位的整数时,应该使用long long类型,可以确保不少于8个字节。
  • 只需要16位整数时,应使用short类型。
  • 需要8位整数时,应该使用char类型。

四,整数类型的极限值

有时候需要查看,当前系统不同整数类型的最大值和最小值,C 语言的头文件limits.h提供了相应的常量,比如SCHAR_MIN代表 signed char 类型的最小值-128,SCHAR_MAX代表 signed char 类型的最大值127。

下面列举了不同整形的最大最小值常量符号。

SCHAR_MIN,SCHAR_MAX:signed char 的最小值和最大值。
SHRT_MIN,SHRT_MAX:short 的最小值和最大值。
INT_MIN,INT_MAX:int 的最小值和最大值。
LONG_MIN,LONG_MAX:long 的最小值和最大值。
LLONG_MIN,LLONG_MAX:long long 的最小值和最大值。
UCHAR_MAX:unsigned char 的最大值。
USHRT_MAX:unsigned short 的最大值。
UINT_MAX:unsigned int 的最大值。
ULONG_MAX:unsigned long 的最大值。
ULLONG_MAX:unsigned long long 的最大值。

五,整数的进制

1,十进制

C 语言的整数默认都是十进制数,如果要表示八进制数和十六进制数,必须使用专门的表示法。

2,八进制

八进制使用0作为前缀,比如017、0377。

int a = 012; // 八进制,相当于十进制的10

3,十六进制

十六进制使用0x或0X作为前缀,比如0xf、0X10。

int a = 0x1A2B; // 十六进制,相当于十进制的6699

4,二进制

非标准格式,有些编译器使用0b前缀,表示二进制数,有些编译无法直接定义二进制形式的整数。

int x = 0b101010;

注意,不同的进制只是整数的书写方法,同一个整数的不同进制形式上不一样,但实际存储都是以二进制形式存储。

5,混合整形表达式

不同进制可以混合使用,比如10 + 015 + 0x20是一个合法的表达式。

int main()
{
    signed x = 10 + 015 + 0x20;
    
    printf("十进制dec = %d\n", x); // 100
    printf("八进制octal = %o\n", x); // 144
    printf("十六进制hex = %x\n", x); // 64
    printf("带符号的八进制octal = %#o\n", x); // 0144
    printf("带符号的十六进制hex = %#x\n", x); // 0x64
    printf("带符号的十六进制hex = %#X\n", x); // 0X64

    return 0;
}

在这里插入图片描述

6,占位符

printf()的进制相关占位符如下。

%d:十进制整数。
%o:八进制整数。
%x:十六进制整数。
%#o:显示前缀0的八进制整数。
%#x:显示前缀0x的十六进制整数。
%#X:显示前缀0X的十六进制整数。

int x = 100;
printf("dec = %d\n", x); // 100
printf("octal = %o\n", x); // 144
printf("hex = %x\n", x); // 64
printf("octal = %#o\n", x); // 0144
printf("hex = %#x\n", x); // 0x64
printf("hex = %#X\n", x); // 0X64
  • 34
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小手追梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值