C语言基本数据类型及其扩展和可移植性问题

不同的C标准,基本数据类型大同小异,但基本都会包括以下几种:

一定含有 char 、short 、int 、long 、float 、double

可能含有long int、long long、long double

甚至还有复数类型float_Complex、double_Complex、long double_Complex

Float_Imaginary、double_Imaginary、longdouble_Imaginary

下面我们介绍最基本的char 、short 、int 、long 、float 、double

其中char、short、int、long都可以用unsigned和signed修饰来表示有符号和无符号,缺省默认是signed

那每种数据类型占用的存储空间是多少呢?答案是不确定的。不同的系统上面位数都不一样。

可以采用sizeof(type)来获得自己机器上各种数据类型位数

例如我的compad320的位数(单位是字节)

#include<stdio.h>
int main(void){
 printf("char length: %d\n",sizeof(char));
 printf("short length: %d\n",sizeof(short));
 printf("int length: %d\n",sizeof(int));
 printf("long length: %d\n",sizeof(long));
 printf("long int length: %d\n",sizeof(long int));
 printf("float length: %d\n",sizeof(float));
 printf("double length: %d\n",sizeof(double));
 return 0;
}

char length: 1

short length: 2

int length: 4

long length: 4

long int length: 4

float length: 4

double length: 8

所以不确定就会带来一些问题,比如你写的程序里面的数据长度都要求是固定的,int 32位,long64位,但是移植到不同的机器上后,可能int是16位,long是32位,这就会出问题。

可不可以在声明类型的时候就指明是多少位呢?比如int32 就作为一种类型,这里就可以在头文件中用typedef定义自己的类型,程序都同意使用自己定义的数据类型,从而在移植程序的时候,只用根据不同的系统来修改类型定义头文件即可。

例如可以在自己的机器上定义出int32

Typedef signed int int32;(因为signed int在本机器上是32位的)

另外需要注意的问题就是如果你自己定义了基本类型,那么printf和scanf在格式化输出的时候还需要做相应的处理,因为不同数据类型对应着不同的输出类型。例如格式化输出long

就需要%ld。所以你还必须定义自己的格式化输出符,可以采用串宏的方法

如:typedef short int16;就该对应定义#define PRId16 “hd”

然后int16 me16;printf(“me16=%”PRId16”\n”,me16);该句经过宏替换后就形成printf(“me16=%””hd””\n”,me16);而C语言默认将三个连续的字符串合并成一个引号一起来的字符串,最后就变成printf(“me16=%hd\n”,me16);从而按正确的格式输出int16类型的数据

自己定义的可能比较麻烦,好在C语言还有扩展数据类型,在inttypes.h头文件中。但这个都需要编译器的支持,不同的编译器可能用法不一样。

C99中引入了stdint.h和inttypes.h,对整数类型的定义和格式转换进行了规范。这种扩展整数类型的定义非常清晰,从类型名字上就可以看出它的长度,这有利于编写可移植的代码。stint.h对整数类型进行定义,inttypes.h包含了stdint.h并增加了可移植的格式控制串和转换函数。

1、stdint.h: 定义标准的扩展整数类型。包括准确长度类型intN_t、最小长度类型int_leastN_t、快速长度类型int_fastN_t、指针长度类型intptr_t、最大长度类型intmax_t(N为类型宽度)。
    定义规则:
    1)类型的长度用宽度N参数化,如intN_t,N常常有8,16,32,64。
    2)若要定义某种类型,则该类型的带符号和无符号类型、类型长度都要定义。如定义int32_t,则有uint32_t类型。
    3)要用...MIN和...MAX宏定义类型的范围。如INT32_MIN,INT32_MAX,UINT32_MAX。
    4)在inttypes.h要用PRIcKN和SCNcKN定义打印该类型的printf和scanf格式控制字符串。c表示转换操作符,有d,i,o,u,x或X;K表示种类,为空或者LEAST,FAST,PTR,MAX;N是该类型的宽度。

/* ISO C99: 7.18 整数类型 <stdint.h>  */
#ifndef _STDINT_H
#define _STDINT_H 1
#include <features.h>
#include <bits/wchar.h>
#include <bits/wordsize.h>
/* 准确类型:指定长度的准确类型  */
/* 有符号  */
/* 有一些与<sys/types.h>中众所周知的inet代码重叠 */
#ifndef __int8_t_defined
# define __int8_t_defined
typedef signed char  int8_t; /* 8位的准确长度类型int8_t=signed char */
typedef short int  int16_t; /* 16位的准确长度类型 */
typedef int   int32_t;
# if __WORDSIZE == 64
typedef long int  int64_t;  /*  64位平台上64位的准确类型为long */
# else
__extension__
typedef long long int  int64_t; /*  32位平台上64位的准确类型为long long */
# endif
#endif
/* 无符号  */
typedef unsigned char  uint8_t;
typedef unsigned short int uint16_t;
#ifndef __uint32_t_defined
typedef unsigned int  uint32_t;
# define __uint32_t_defined
#endif
#if __WORDSIZE == 64
typedef unsigned long int uint64_t;
#else
__extension__
typedef unsigned long long int uint64_t;
#endif

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/6b6aaefc84e43b1774e208ee9ff10981.html