long power在c语言中,C语言中整型的定义

使用C语言时,用sizeof运算int,long int,long long int时,得到的结果不尽相同。那么这些类型长度与什么有关?与机器?与编译器(语言实现)?还是操作系统?我查阅了一些资料,将之总结下来,希望能有一些参考价值。也欢迎指正纠错,共同学习!

C语言的实现一般由编译器和标准库开发者提供,而这部分开发者有很多,常见的编译器有微软的vc,GNU的gcc,Borland的TC,Intel也有自己的C编译器。各个提供者都有自己的想法,都可能会往语言特性中加入一些新的扩展实现,比如一些关键字,一些标准没有的标准库函数,或是一些标准库函数的返回值与其他的不一样等等。但他们都会遵循C语言标准,即是我们常听说的C99、C90/C89、C11等等。

一、C标准定义:

int类型是一个类型系列,在C语言中,基本的int 类型包括char,long,int,short,bool(_Bool关键字,C99)。C99标准中说明了,实现必须等于或大于的定义。

以下列出所有C标准中定义的类型(C99):

char: 机器上最小的地址单元。头文件中对应CHAR_BIT,8 bits;

signed char:与char长度相同,范围必须能承载至少[-127,+127],即8 bits大小,其中一位用作符号位;

unsigned char:与char长度相同,但无符号位,范围大小为[0, 2^CHAR_BIT - 1],8 bits;

short

short int

signed short

signed short int:以上四种为带符号的short类型,必须能承载至少[-32767, +32768]范围,也即是至少16bits长度。

unsigned short

unsigned short int: 同short, 但无符号,长度至少16bits。

int

signed

signed int:基本的int,必须能至少承载[-32767, +32767]范围,也即是说,至少16bits长度。

unsigned int

unsigned:同int,但无符号,长度至少16bits。

long

long int

signed long

signed long int:long 型的整数,必须能承载至少[-2147483647, +2147483647]范围,也就是至少32bits长度。(注:只有一个long)

unsigned long

unsigned long int:同long,但无符号位。

long long

long long int

signed long long

signed long long int:long long 类型,必须至少能承载[-9223372036854775807, +9223372036854775807],也就是至少64bits长度。

unsigned long long

unsigned long long int:同long long类型,没有符号位。

二、C99的固定宽度int类型定义:

为更好的做到各个平台兼容,也给嵌入式环境更方便,从C99开始规定了文件,固定各个类型的长度,可以直接include这个头文件使用这些类型

(注:貌似vc没有这个头文件,我一般到网上下,但最好还是看看vc编译器文档,以它为准,自己写一个。):

Type category

Signed types

Unsigned types

Type

Minimum value

Maximum value

Type

Minimum value

Maximum value

Exact width

intN_t

INTN_MIN

INTN_MAX

uintN_t

0

UINTN_MAX

Least width

int_leastN_t

INT_LEASTN_MIN

INT_LEASTN_MAX

uint_leastN_t

0

UINT_LEASTN_MAX

Fastest

int_fastN_t

INT_FASTN_MIN

INT_FASTN_MAX

uint_fastN_t

0

UINT_FASTN_MAX

Pointer

intptr_t

INTPTR_MIN

INTPTR_MAX

uintptr_t

0

UINTPTR_MAX

Maximum width

intmax_t

INTMAX_MIN

INTMAX_MAX

uintmax_t

0

UINTMAX_MAX

三、GCC编译器int 限制:

GCC不支持C99和C11中定义的扩展integer类型。除此之外其他基本类型都支持的很好。

根据C99标准中说明的:

5种标准signed integer type:signed char, short int, int, long int, long long int;

5种标准unsigned integer type:unsigned char, unsigned short int, unsigned int, unsigned long int, unsigned long long int;

四、GCC编译器支持的各种硬件架构:

常见的架构

x86-64,或x64, AMD64(64bits);

IA-64,Intel Itanium 64;

ARM(32-bits,64-bits);

SPARC(64bits);

PowerPC(32bits,64bits);

GCC支持很多架构,而其中也有很多嵌入式系统架构。16bits、32bits或者64bits架构,那么要实现C标准的各种int类型,首先可能需要处理器的支持,假设32bits处理器不支持64bits整形运算(很多指令集都支持),为实现C源码中的运算,可能需要编译器编译成目标代码时完成大于机器字整形数据的运算拼装,若支持,直接编译成相应的指令即可。

五、总结:

根据查到的这些资料,应该这么描述,C语言中的整型与目标机器指令集有关,也与编译器有关。但编译器是比硬件架构更高层的东西,没有这些指令集,也可以用一些实现来完成大于机器字长度的运算,更何况,要是编译器在某个架构上无法实现这些运算,直接在编译器用户手册上说清楚,不支持这个硬件架构即可了。整型的长度,与机器有一定关系,但主要与编译器在当前硬件架构上的实现有关系。

六、代码测试:

#include

#include

#define println(__S) printf ("%s\n", __S)

int main (int argc, char* argv []) {

printf (

" char size = %d\n"

" short size = %d\n"

" int size = %d\n"

" long int size = %d\n"

" long size = %d\n"

" long long size = %d\n"

" long long int size = %d\n"

" float size = %d\n"

" double size = %d\n"

" long double size = %d\n",

sizeof (char),

sizeof (short),

sizeof (int),

sizeof (long int),

sizeof (long),

sizeof (long long),

sizeof (long long int),

sizeof (float),

sizeof (double),

sizeof (long double)

);

return 0;

}

以下是在两种机器上运行相同C代码的输出:

(1)x86_64(AMD64):

0818b9ca8b590ca3270a3433284dd417.png

(2)AMD32:

引用出处:

GNU GCC 4.9.3 Manual :https://gcc.gnu.org/onlinedocs/gcc-4.9.3/gcc/index.html#toc_G_002b_002b-and-GCC

C标准:

(1) ANSI C standard (X3.159-1989), 发布于 1990,之后成为ISO/IEC 9899:1990标准,C89或C90.

(2) ISO/IEC 9899:1990修正版,于1995年发布,C94或C95

(3) ISO/IEC 9899:1999,一个新版本标准,于1999年发布,C99

(4) ISO/IEC 9899:2011,新版本标准,于2011年发布,C11,目前最新标准。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值