不同编译器下基本数据长度

KEIL uVision2 C51编译器所支持的数据类型

表中列出了KEIL uVision2 C51编译器所支持的数据类型。在标准C语言中基本的数据类型为char,int,short,long,float和double,而在C51编译器中int和short相同,float和double相同,这里就不列出说明了。下面来看看它们的具体定义:

数据类型

 

长 度

 

值 域

 

unsigned char

 

单字节

 

0~255

 

signed char

 

单字节

 

-128~+127

 

unsigned int

 

双字节

 

0~65535

 

signed int

 

双字节

 

-32768~+32767

 

unsigned long

 

四字节

 

0~4294967295

 

signed long

 

四字节

 

-2147483648~+2147483647

 

float

 

四字节

 

±1.175494E-38~±3.402823E+38

 

*

 

1~3字节

 

对象的地址

 

bit

 

 

0或1

 

sfr

 

单字节

 

0~255

 

sfr16

 

双字节

 

0~65535

 

sbit

 

 

0或1

 

TorboC编译器的数据长度说明:

整型变量

  整型变量可分为以下几类:

  1.基本型

  类型说明符为int,在内存中占2个字节,其取值为基本整常数。

  2.短整量

  类型说明符为short int或short'C110F1。所占字节和取值范围均与基本型相同。

  3.长整型

  类型说明符为long int或long ,在内存中占4个字节,其取值为长整常数。

  4.无符号型

  类型说明符为unsigned。

  无符号型又可与上述三种类型匹配而构成:

  (1)无符号基本型 类型说明符为unsigned int或unsigned。

  (2)无符号短整型 类型说明符为unsigned short

  (3)无符号长整型 类型说明符为unsigned long

  各种无符号类型量所占的内存空间字节数与相应的有符号类型量相同。但由于省去了符号位,故不能表示负数。 下表列出了Turbo C中各类整型量所分配的内存字节数及数的表示范围。

类型说明符    数的范围     分配字节数
int       -32768~32767     ■■
short int    -32768~32767     ■■
signed int    -32768~32767     ■■
unsigned int   0~65535        ■■
long int  -2147483648~2147483647  ■■■■
unsigned long  0~4294967295     ■■■■                           

在ARM系统应用的数据类型如下 不同编译器可能有所不同

ARM编译器支持的数据类型

************************************************************
数据类型 长度(位) 对齐特性
Char 8 1(字节对齐)
short 16 2(百字对齐)
Int 32 4(字对齐)
Long 32 4(字对齐)
Longlong 64 4(字对齐)
Float 32 4(字对齐)
Double 64 4(字对齐)
Long double 64 4(字对齐)
All pointers 32 4(字对齐)
Bool(C++ only) 32 4(字对齐)

1.整数类型
ARM体系中,整数类型是以2的补码形式存储的。对于long long类型来说,在little endian内存模式下,其低32位保存在低地址的字单元中,高32为保存在高地址的字单元中;在big endian模式下,其低32位保存在高地址的字单元中,高32为保存在低地址的字单元中。对于整型数据的操作遵守下面的规则:
**所有带符号的整型书的运算是按照二进制的补码进行的。
**带符号的整型数的运算不进行符号的扩展。
**带符号的整型数的右移操作是算数移位。
**制定的移位位数的数是8位的无符号数。
**进行移位操作的数被作为32位数。
**超过31位的逻辑左移的结果为0。
**对于无符号数和有符号的正数来说,超过32位的右移操作结果为0;对于有符号的负数来说,超过32位的右移操作结果为-1。
**整数除法运算的余数和除数有相同的符号。
**当把一个整数截断成位数更短的整数类型的数时,并不能保证所得到的结果的最高位的符号位的正确性。
**整型数据之间的类型转换不会产生异常中断。
**整型数据的溢出不会产生异常中断。
**整型数据除以0将会产生异常中断。
2.浮点数
ARM体系中,浮点数是按照IEEE标准存储的。
**float类型的数是按照IEEE的单精度数表示的。
**double和long double 是用IEEE的双精度数表示的。
对于浮点数的操作遵守下面的规则:
**遵守正常的IEEE754规则。
**当默认情况下禁止浮点数运算异常中断。
**当发生卷绕时,用最接近的数据来表示。
3.指针类型的数据
下面的规则适用于处数据成员指针以外的其他指针:
**NULL被定义为0。
**相邻的两个存储单元地址相差一。
**在指向函数的指针和指向数据的指针进行数据转换时,编译器将会产生警告信息。
**类型size_t被定义为unsigned int.
**类型ptrdiff_t被定义为signed int。
**两个指针类型的数据相减时,结果可以按照下面的公式得到。
((int)a-(int)b)/(int)sizeof(type pointed to)
这时,只要指针所指的对象不是pack的,其对齐特性能够满足整除的要求。
ARM基础知识
*****************************************************

ARM编译器中预定义的宏

*****************************************************
ARM编译器预定义了一些宏,这些预定义宏对应一定的数值,有些预定义宏没有对应数值,见下表:

_arm _ 使用编译器armcc,tcc,armcpp,tcpp时

_ARMCC_VERSION Ver 代表编译器版本号,其格式为:
PVtbbb,其中:
P为产品编号(1代表ADS)
V为副版本号(1代表1.1)
T为补丁版本号(0代表1.1)
bbb为build号(比如650)

_APCS_INTERWORK _ 使用编译选项-apcs/interwork时

_APCS_ROPI _ 使用编译选项apcs/ropi时

_RWPI _ 使用编译选项-apcs/rwpi时

_APCS_SWST _ 使用编译选项-apcs/swst时

_BIG_ENDIAN _ 编译器针对目标系统使用big-endian内存模式时

_cplusplus _ 编译器工作与C++模式时

_CC_ARM _ 返回编译器的名称

_DATE_ date 编译源文件的日期

_embedded_cplusplus 编译器工作于EC++模式时

_FEATURE_SINGED_CHAE 使用编译设置选项-zc时设置该预定义宏

_FILE_ name 包含全路径的当前被编译的源文件名称

_func_ name 当前被编译的函数名称

_LINE_ num 当前被编译的代码行号名称

_MOUDLE_ mod 预定义宏_FILE_的文件名称部分

_OPTIMISE_SPACE _ 使用编译选项-OSPACE时

_OPTIMISE_TIME _ 使用编译选项-Otime时

_pretty_func name unmangled的当前函数名称

_sizeof_int 4 sizeof(int),在预处理表达式中可以使用

_sizeof_long 4 sizeof(long),在预处理表达式中可以使用

_sizeof_ptr 4 sizeof(void*)在预处理表达式中可以使用

_SOFTFP _ 编译时使用浮点数

_ _ 在各种编译器模式下

_STDC_VERSION _ 标准的版本信息

_STRICT_ANSI_ _ 使用编译选项-STRICT时

_TARGET_ARCH_xx _ xx代表ARM体系编号

_TARGET_CPU_xx _ xx代表CPU编号

_TARGET_FEATURE_ 当ARM体系支持指令PLD,LDRD,STRD,MCRR,MRRC时
DOUBLEWORD _ 设置该定义宏

_TARGET_FEATURE_ 当系统中包含DSP乘法处理器时,设置该
DSPMUL _ 预定义宏

_TARGET_FEATURE_ 如果目标ARM体系支持半字访问以及有符号的字节数据
HALFWORD _ ,设置该预定义宏

_TARGET_FEATURE_ 如果目标ARM体系支持长乘法指令MULL和
MULTIPLY _ MUAL,设置该预定义宏

_TARGET_FEATURE_ 如果目标ARM体系支持THUMB指令
THUMB _

_TARGET_FPU_xx _ 表示FPU选项,可能取值如下所示:
_TARGET_FPU_VFP
_TARGET_FPU_FPA
_TARGET_FPU_SOFTVFP
_TARGET_FPU_SOFTVFP_VFP
_TARGET_FPU_SOFTFPA
_TARGET_FPU_NONE

_thumb _ 编译器为tcc或tcpp时,设置该预定义宏

_TIME 源文件编译时间 

### 不同操作系统中数据类型长度差异 在编程过程中,理解不同操作系统下基本数据类型的大小对于编写高效且可移植的代码至关重要。C标准定义了一些常见的数据类型及其最小范围,但具体实现可能会因编译器和目标平台的不同而有所变化。 #### 整数类型 整数类型包括 `char`、`short int`、`int`、`long int` 和 `long long int`。这些类型的位宽取决于具体的硬件架构和操作系统的组合: - **32-bit Windows**: 使用 LP32 数据模型,在此模型中,指针 (`void*`) 占用 32 位,`int` 类型也是 32 位。 - **64-bit Windows (LLP64)**: 这里除了保持 `int` 是 32 位外,其他如 `long` 仍然是 32 位,只有 `long long` 及指针变为 64 位。 - **Linux/Unix-like Systems (LP64)**: 对于大多数现代 Linux 发行版,默认情况下采用的是 LP64 模型,其中 `long` 和指针都是 64 位,但是 `int` 继续维持在 32 位不变[^1]。 ```c #include <stdio.h> #include <limits.h> int main() { printf("Size of char: %lu byte(s)\n", sizeof(char)); printf("Size of short: %lu byte(s)\n", sizeof(short)); printf("Size of int: %lu byte(s)\n", sizeof(int)); printf("Size of long: %lu byte(s)\n", sizeof(long)); printf("Size of long long: %lu byte(s)\n", sizeof(long long)); // Print ranges for integer types printf("\nRange of signed integers:\n"); printf("signed char : [%d, %d]\n", SCHAR_MIN, SCHAR_MAX); printf("short : [%hd, %hd]\n", SHRT_MIN, SHRT_MAX); printf("int : [%d, %d]\n", INT_MIN, INT_MAX); printf("long : [%ld, %ld]\n", LONG_MIN, LONG_MAX); printf("long long : [%lld, %lld]\n", LLONG_MIN, LLONG_MAX); return 0; } ``` #### 浮点数类型 浮点数类型主要包括 `float`、`double` 和 `long double`。尽管 IEEE 754 标准规定了单精度(32 位)、双精度(64 位)格式的具体细节,但对于扩展精度的支持则依赖于特定的操作系统和处理器体系结构。例如,在某些平台上,`long double` 可能提供更高的精度,而在另一些平台上它可能只是简单的别名给普通的 `double`[^2]。 #### 字符串和其他复合类型 字符串是以字符数组的形式存储,并以空终止符 `\0` 结束;因此它们的实际占用空间不仅限于所含字符的数量还包括额外的一字节用于表示结束标志。至于结构体(structure),联合体(union)等复杂的数据结构,则会受到内存对齐规则的影响,这同样是由底层 OS 和 CPU 架构共同决定的因素之一。 为了确保程序具有良好的跨平台兼容性和性能表现,开发者应当熟悉各个平台上的特性并合理利用预处理指令或者条件编译技术来调整源码中的关键部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值