各平台long,int,short,char的大小

本文通过实验展示了在ARM7、ARM9及PC(I386)平台上各种基本数据类型的字节大小,包括unsigned long long、unsigned long、unsigned int等,并提供了编译和运行的详细步骤。

ARM7,ARM9,PC都是32位CPU: char为1 Byte, short为2 Byte, int和long都为4 Byte, long long为8 Byte

源码

[guowenxue@localhost QCTool]$ cat test.c 

#include <stdio.h>

int main(void)

{

   printf("unsigned long long: %d\n", sizeof(unsigned long long));

   printf("unsigned long: %d\n", sizeof(unsigned long));

   printf("unsigned int: %d\n", sizeof(unsigned int));

   printf("unsigned short: %d\n", sizeof(unsigned short));

   printf("unsigned char: %d\n", sizeof(unsigned char));

   return 0;

}

编译

[guowenxue@localhost QCTool]$ arm-elf-gcc test.c -Wl,-elf2flt -o test_ARM7        

[guowenxue@localhost QCTool]$ arm-linux-gcc test.c -o test_ARM9

[guowenxue@localhost QCTool]$ gcc test.c -o test_I386

 

W90P710(ARM7):

root:/tmp> ./test_ARM7 

unsigned long long: 8

unsigned long: 4

unsigned int: 4

unsigned short: 2

unsigned char: 1

root:/tmp> uname -a

Linux (none) 2.4.20-uc0 #5722 Mon Mar 14 16:13:08 CST 2011 armv3l unknown

root:/tmp> cat /proc/cpuinfo 

Processor       : Winbond W90P710 rev 1 (v3l)

BogoMIPS        : 39.83

Hardware        : W90P710

Revision        : 0000

Serial          : 0000000000000000

 

AT91SAM9260(ARM9)

/tmp >: ./test_ARM9 

unsigned long long: 8

unsigned long: 4

unsigned int: 4

unsigned short: 2

unsigned char: 1

/tmp >: uname -a

Linux netaccess 2.6.22.1 #5481 Wed Feb 23 13:45:32 CST 2011 armv5tejl unknown

/tmp >: cat /proc/cpu

/proc/cpu/     /proc/cpuinfo

/tmp >: cat /proc/cpu

/proc/cpu/     /proc/cpuinfo

/tmp >: cat /proc/cpuinfo 

Processor       : ARM926EJ-S rev 5 (v5l)

BogoMIPS        : 99.12

Features        : swp half fastmult edsp java 

CPU implementer : 0x41

CPU architecture: 5TEJ

CPU variant     : 0x0

CPU part        : 0x926

CPU revision    : 5

Cache type      : write-back

Cache clean     : cp15 c7 ops

Cache lockdown  : format C

Cache format    : Harvard

I size          : 8192

I assoc         : 4

I line length   : 32

I sets          : 64

D size          : 8192

D assoc         : 4

D line length   : 32

D sets          : 64

 

Hardware        : Atmel AT91SAM9260-EK

Revision        : 0000

Serial          : 0000000000000000

 

 

PC(I386上)

[guowenxue@localhost QCTool]$ ./test_I386

unsigned long long: 8

unsigned long: 4

unsigned int: 4

unsigned short: 2

unsigned char: 1

[guowenxue@localhost QCTool]$ uname -a

Linux localhost.localdomain 2.6.9-42.ELsmp #1 SMP Sat Aug 12 09:39:11 CDT 2006 i686 i686 i386 GNU/Linux

[guowenxue@localhost QCTool]$ cat /proc/cpuinfo 

processor       : 0

vendor_id       : GenuineIntel

cpu family      : 6

model           : 15

model name      : Intel(R) Pentium(R) Dual  CPU  E2180  @ 2.00GHz

stepping        : 13

cpu MHz         : 2000.006

cache size      : 1024 KB

physical id     : 0

siblings        : 2

core id         : 0

cpu cores       : 2

fdiv_bug        : no

hlt_bug         : no

f00f_bug        : no

coma_bug        : no

fpu             : yes

fpu_exception   : yes

cpuid level     : 10

wp              : yes

flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm pni monitor ds_cpl est tm2 xtpr

<think> 我们讨论的是C/C++等编程语言中的基本数据类型:long long, long, char, int。这些数据类型用于声明变量,存储不同范围和类型的值。 注意:用户提到了“long long long”,但通常只有“long long”作为扩展整数类型,而“long long long”是不存在的。我们这里将按照标准数据类型来解释。 1. **int**: - 含义:表示整数,通常为32位(4字节),范围约为$-2^{31}$到$2^{31}-1$(即$-2,147,483,648$到$2,147,483,647$)[^2]。 - 作用:用于存储普通整数,运算速度快。 - 使用情况:最常用的整数类型,如循环计数器、数组索引等。 2. **long**: - 含义:长整数,长度根据系统不同而变化。在32位系统中通常为32位(与int相同),在64位系统中可能为64位[^1]。 - 作用:当整数范围可能超过int时使用,但具体范围依赖于编译器和系统。 - 使用情况:需要更大整数范围时,但实际使用中,由于可移植性问题,通常优先使用intlong long。 3. **long long**: - 含义:至少64位的整数类型,范围约为$-2^{63}$到$2^{63}-1$(即$-9,223,372,036,854,775,808$到$9,223,372,036,854,775,807$)[^1][^2]。 - 作用:存储非常大的整数,避免溢出。 - 使用情况:需要处理超过32位的整数,如大数计算、时间戳(纳秒级)等。 4. **char**: - 含义:字符类型,通常为8位(1字节),可以表示ASCII字符或小整数(-128到127)[^2]。 - 作用:存储单个字符或小范围整数。 - 使用情况:处理字符数据(如字符串中的字符),或者需要节省内存时存储小整数。 关于这些类型的使用注意事项: - 数据类型的实际大小可能因编译器和系统而异。可以使用`sizeof`运算符获取大小。 - 在需要保证大小时,可使用固定宽度整数类型(如`int32_t`, `int64_t`等),定义在`stdint.h`(C)或`<cstdint>`(C++)中。 - 选择类型时,应根据需要的数值范围选择,同时考虑内存和性能。 示例代码(C语言): ```c #include <stdio.h> #include <stdint.h> // 固定宽度整数类型 int main() { char c = 'A'; // 字符 int i = 100000; // 普通整数 long l = 1234567890L; // 长整数(加L后缀) long long ll = 1234567890123456789LL; // 长长整数(加LL后缀) printf("char: %c, size: %zu byte\n", c, sizeof(c)); printf("int: %d, size: %zu bytes\n", i, sizeof(i)); printf("long: %ld, size: %zu bytes\n", l, sizeof(l)); printf("long long: %lld, size: %zu bytes\n", ll, sizeof(ll)); return 0; } ``` 输出示例(64位系统): ``` char: A, size: 1 byte int: 100000, size: 4 bytes long: 1234567890, size: 8 bytes long long: 1234567890123456789, size: 8 bytes ``` 注意:在64位Linux系统中,long通常为8字节,而在Windows 64位系统中,long可能为4字节。因此,可移植代码中,如果需要8字节整数,建议使用long long。 相关问题: 1. 如何确保整型变量在不同平台上的大小一致? 2. 什么是无符号整型?它们的作用是什么? 3. 为什么在C语言中需要固定宽度整数类型(如int32_t)? 4. 在C/C++中,整型提升规则是什么? 5. 如何检测整型运算中的溢出? </think> ### 编程中基本数据类型的含义、作用及使用情况 在编程中,`long long`, `long`, `char`, `int` 是表示不同范围和特性的基本数据类型,用于高效存储和操作数据。 #### 1. **int (整数类型)** - **含义**:32位带符号整数数据类型(在大多数现代系统中) - **范围**:$ -2^{31} \text{ 到 } 2^{31}-1 $ ($ -2,147,483,648 \text{ 到 } 2,147,483,647 $)[^2] - **内存占用**:4字节(32位) - **作用**: - 存储中等范围的整数值 - 作为循环计数器、数组索引等通用整数操作 - **使用情况**: ```c int count = 100; // 循环计数器 int temperature = 25; // 温度值 int array[10]; // 数组声明 ``` #### 2. **long (长整数类型)** - **含义**:至少32位的扩展整数类型(大小依赖系统和编译器) - **范围**: - 32位系统:$ -2^{31} \text{ 到 } 2^{31}-1 $(同int) - 64位系统:$ -2^{63} \text{ 到 } 2^{63}-1 $[^1] - **内存占用**:4字节(32位系统)或8字节(64位系统) - **作用**: - 存储比int更大范围的整数 - 兼容历史代码和特定系统API - **使用情况**: ```c long population = 7800000000L; // 全球人口 long fileSize = 2147483648L; // 超过int最大值的文件大小 ``` #### 3. **long long (超长整数类型)** - **含义**:64位带符号整数类型(C99标准引入) - **范围**:$ -2^{63} \text{ 到 } 2^{63}-1 $ ($ -9,223,372,036,854,775,808 \text{ 到 } 9,223,372,036,854,775,807 $)[^1][^2] - **内存占用**:8字节(64位) - **作用**: - 存储极大整数值(如天文数字、加密密钥) - 防止大数运算时的溢出问题 - **使用情况**: ```c long long nationalDebt = 31415926535897LL; // 国家债务 long long timestamp = 1715000000000000LL; // 纳秒级时间戳 ``` #### 4. **char (字符类型)** - **含义**:8位基本数据类型 - **范围**: - 有符号:$ -2^7 \text{ 到 } 2^7-1 $ ($ -128 \text{ 到 } 127 $) - 无符号:$ 0 \text{ 到 } 2^8-1 $ ($ 0 \text{ 到 } 255 $)[^2] - **内存占用**:1字节 - **作用**: - 存储ASCII字符和UTF-8编码单元 - 处理原始二进制数据 - **使用情况**: ```c char letter = 'A'; // 单个字符 char buffer[1024]; // 文本缓冲区 unsigned char pixel = 0xFF; // 图像像素值 ``` #### 数据类型对比表 | 类型 | 位数 | 范围(带符号) | 典型用途 | |------------|------|------------------------------------------|------------------------| | `char` | 8 | $-128 \text{ 到 } 127$ | 字符、小整数 | | `int` | 32 | $-2^{31} \text{ 到 } 2^{31}-1$ | 通用整数运算 | | `long` | 32/64 | 系统相关($ \geq \text{int}$) | 大整数、系统兼容 | | `long long`| 64 | $-2^{63} \text{ 到 } 2^{63}-1$ | 极大整数、科学计算 | ### 关键注意事项 1. **平台依赖性**: - `long` 的大小随系统变化(32位系统通常4字节,64位系统8字节) - 使用固定宽度类型(如`int32_t`)可确保跨平台一致性 2. **内存对齐**: ```c struct Data { char id; // 1字节 int value; // 4字节(可能添加3字节填充) }; // 总大小通常为8字节而非5字节 ``` 3. **类型转换风险**: ```c int big = 2147483647; short small = big; // 导致溢出(值截断) ``` 4. **最佳实践**: - 明确使用`unsigned`修饰无符号数 - 大数运算优先选用`long long` - 字符处理使用`char`,但需注意编码问题 ### 相关问题 1. 为什么在64位系统中`long`的大小可能发生变化?[^1] 2. 如何检测整数运算中的溢出问题? 3. `unsigned char`与`signed char`在实际应用中有何区别? 4. 什么是类型提升规则?它在表达式求值中如何应用? 5. 为什么`sizeof(int)`在不同编译器中可能产生不同结果?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值