[牛人杂谈]

C语言中的整数(short,int,long)

[复制链接]
1107|12
手机看帖
扫描二维码
随时随地手机跟帖
小明的同学|  楼主 | 2018-12-19 13:55 | 显示全部楼层 |阅读模式
刚才看到有人帖子里出现了,这个我特别找来资料学习一下,之前是不是大家很少用到short和long
整数是编程中常用的一种数据,C语言中有三种整数类型,分别为 short、int 和 long。int 称为整型,short 称为短整型,long 称为长整型,它们的长度(所占字节数)关系为:

short <= int <= long

它们具体占用几个字节C语言并没有规定,C语言只做了宽泛的限制:
short 至少占用2个字节。
int 建议为一个机器字长。32位环境下机器字长为4字节,64位环境下机器字长为8字节。
short 的长度不能大于 int,long 的长度不能小于 int。

这就意味着,short 并不一定真的”短“,long 也并不一定真的”长“,它们有可能和 int 占用相同的字节数。决定整数长度的因素很多,包括硬件(CPU和数据总线)、操作系统、编译器等。

小明的同学|  楼主 | 2018-12-19 13:56 | 显示全部楼层
在16位环境下,short 为2个字节,int 为2个字节,long 为4个字节。16位环境多用于单片机和低级嵌入式系统,在PC和服务器上基本都看不到了。

对于32位的 Windows、Linux 和 OS X,short 为2个字节,int 为4个字节,long 也为4个字节。PC和服务器上的32位系统占有率也在慢慢下降,嵌入式系统使用32位越来越多。

在64位环境下,不同的操作系统会有不同的结果,如下所示(长度以字节计):
操作系统
short
int
long
Win64244
类Unix系统(包括 Unix、Linux、OS X、BSD、Solaris 等)248


目前我们使用较多的PC系统为 Win XP、Win 7、Win 8、Win 10、Mac OS X、Linux,short 和 int 的长度都是固定的,分别为2和4,大家可以放心使用,long 的长度在 Win64 和类Unix系统下会有所不同,使用时要注意移植性。

获取某个数据类型的长度可以使用 sizeof 操作符,如下所示:
#include <stdio.h>
int main()
{
short a = 10;
int b = 100;
long c = 1000;
char d = 'X';
int a_length = sizeof a;
int b_length = sizeof(int);
printf("a=%d, b=%d, c=%d, d=%d\n", a_length, b_length, sizeof(c), sizeof(char));
return 0;
}
在Win7下的运行结果为:
a=2, b=4, c=4, d=1

使用特权

评论回复
小明的同学|  楼主 | 2018-12-19 13:57 | 显示全部楼层
sizeof 用来获取某个数据类型或变量所占用的字节数,如果后面跟的是变量名称,那么可以省略 ( ),如果跟的是数据类型,就必须带上 ( )。
需要注意的是,sizeof 是C语言中的操作符,不是函数,所以可以不带 ( ),后面会详细讲解。
符号位
在数学中,数字有正负之分。在C语言中也是一样,short、int、long 都可以带上符号,例如:
short a = -10; //负数
int b = +10; //正数
long c = (-9) + (+12); //负数和正数相加
如果不带正负号,默认就是正数。

符号也要在内存中体现出来。符号只有正负两种情况,用1位就足以表示,这1位就是最高位。以 int 为例,它占用32位的内存,0~30位表示数值,31 位表示正负号。如下图所示:
912435c19ddbf7969f.png
在编程语言中,计数往往是从0开始,例如字符串 "abc123",我们称第 0 个字符是 a,第 1 个字符是 b,第 5 个字符是 3。这和我们平时从 1 开始计数的习惯不一样,大家要慢慢适应,培养编程思维。
在符号位中,用0表示正数,用1表示负数。例如 short 类型的 -10、+16 在内存中的表示如下:
697335c19ddcf71809.png


使用特权

评论回复
小明的同学|  楼主 | 2018-12-19 14:12 | 显示全部楼层
如果不希望设置符号位,可以在数据类型前面加 unsigned,如下所示:
unsigned short a = 12;
unsigned int b = 1002;
unsigned long c = 9892320;
这样,short、int、long 中就没有符号位了,所有的位都用来表示数值。也就意味着,使用了 unsigned 只能表示正数,不能表示负数了。

如果是unsigned int,那么可以省略 int ,只写 unsigned,例如:

unsigned n = 100;
它等价于:
unsigned int n = 100;
输出无符号数使用%u,代码如下:

#include <stdio.h>
#include <stdlib.h>
int main()
{
int a=1234;
unsigned a1=1234;
int b=0x7fffffff;
int c=0x80000000; // 0x80000000 = 0x7fffffff + 0x1
int d=0xffffffff;
unsigned e=0xffffffff;
printf("a=%d, a(u)=%u\n", a, a);
printf("a1=%d, a1(u)=%u\n", a1, a1);
printf("b=%d, b(u)=%u\n", b, b);
printf("c=%d, c(u)=%u\n", c, c);
printf("d=%d, d(u)=%u\n", d, d);
printf("e=%d, e(u)=%u\n", e, e);
system("pause");
return 0;
}
输出结果:
a=1234, a(u)=1234
a1=1234, a1(u)=1234
b=2147483647, b(u)=2147483647
c=-2147483648, c(u)=2147483648
d=-1, d(u)=4294967295
e=-1, e(u)=4294967295

可以发现,无论变量声明为有符号数还是无符号数,只有当以 %u 格式输出时,才会作为无符号数处理;如果声明为 unsigned,却以 d% 输出,那么也是有符号数。
d、e 的输出值之所以为 -1,与它们在内存中的存储形式有关

使用特权

评论回复
antusheng| | 2018-12-19 15:49 | 显示全部楼层
多谢分享。

使用特权

评论回复
heisexingqisi| | 2018-12-20 21:39 | 显示全部楼层
48515c1b9b990df28.png

发现 int 和long 都是4个字节。

使用特权

评论回复
598330983| | 2018-12-21 14:13 | 显示全部楼层
貌似现在很少用long这个关键词了

使用特权

评论回复
zhuomuniao110| | 2018-12-21 23:39 | 显示全部楼层
short好像是16BIT,int 32BIT,char 8BIT

使用特权

评论回复
643757107| | 2018-12-21 23:47 | 显示全部楼层
一直不明白 long 和int的区别。

使用特权

评论回复
643757107| | 2018-12-21 23:48 | 显示全部楼层
C语言标准是这样规定的:int最少16位(2字节),long不能比int短,short不能比int长,具体位长由编译器开发商根据各种情况自己决定。在32位x86处理器上,short、int、long普遍的长度是2字节、4字节、4字节。当然如果编译器开发商愿意,long完全可以是8字节。

在 win64 下,long 也是 32 bit 的,4 字节。int则是64bit,8字节!

使用特权

评论回复
dongnanxibei| | 2018-12-22 00:00 | 显示全部楼层
注意到了大于等于号,等于号。

使用特权

评论回复
稳稳の幸福| | 2018-12-23 00:39 | 显示全部楼层
short 并不一定真的”短“,long 也并不一定真的”长“

使用特权

评论回复
wowu| | 2019-1-7 13:13 | 显示全部楼层
不同的单片机 代表的长度也不一样

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

111

主题

1330

帖子

2

粉丝