int long 字节数

2008年05月19日 星期一 上午 09:01

上次腾讯面试,问我int和long分别几个字节,结果被鄙视了。

事过N天,鼓起勇气来好好查了一下,发现学问还是蛮大的。

int类型比较特殊,具体的字节数同机器字长和编译器有关。如果要保证移植性,尽量用__int16 __int32 __int64吧,或者自己typedef int INT32一下。

C、C++标准中只规定了某种类型的最小字节数(防止溢出)

64位指的是cpu通用寄存器的数据宽度是64位的。找到一个图

数据类型名称 字节数 别名 取值范围
int * signed,signed int 操作系统 决定,即与操作系统的"字长"有关
unsigned int * unsigned 由操作系统决定,即与操作系统的"字长"有关
__int8 1 char,signed char –128 到 127
__int16 2 short,short int,signed short int –32,768 到 32,767
__int32 4 signed,signed int –2,147,483,648 到 2,147,483,647
__int64 8 –9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
bool 1 false 或 true
char 1 signed char –128 到 127
unsigned char 1 0 到 255
short 2 short int,signed short int –32,768 到 32,767
unsigned short 2 unsigned short int 0 到 65,535
long 4 long int,signed long int –2,147,483,648 到 2,147,483,647
long long 8 none (but equivalent to __int64) –9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
unsigned long 4 unsigned long int 0 到 4,294,967,295
enum * 由操作系统决定,即与操作系统的"字长"有关
float 4 3.4E +/- 38 (7 digits)
double 8 1.7E +/- 308 (15 digits)
long double 8 1.7E +/- 308 (15 digits)
wchar_t 2 __wchar_t 0 到 65,535

类型标识符类型说明长度
(字节)
范围备注
char 字符型1-128 ~ 127-27 ~ (27 -1)
unsigned char 无符字符型10 ~ 2550 ~ (28 -1)
short int 短整型2-32768 ~ 327672-15 ~ (215 - 1)
unsigned short int 无符短整型20 ~ 655350 ~ (216 - 1)
int 整型4-2147483648 ~ 2147483647-231 ~ (231 - 1)
unsigned int 无符整型40 ~ 42949672950 ~ (232 -1)
float 实型(单精度)41.18*10-38 ~ 3.40*1038 7位有效位
double 实型(双精度)82.23*10-308 ~ 1.79*10308 15位有效位
long double 实型(长双精度)103.37*10-4932 ~ 1.18*104932 19位有效位

### 不同平台下 `short`、`int` 和 `long` 的字节宽度 在不同的平台上,C/C++ 中基本数据类型的大小可能会有所不同。这种差异主要取决于编译器实现和目标架构。 #### 数据类型大小的一般规则 通常情况下,在大多数现代系统中遵循以下一般规则[^1]: - **`short`**: 至少 2 字节(16 位)。具体来说,常见的实现将其定义为 2 字节。 - **`int`**: 至少 4 字节(32 位),但在某些嵌入式系统中可能更小(例如 STC89C51 上的 `int` 是 2 字节)。 - **`long`**: 至少 4 字节(32 位)。然而,在一些 64 位系统上,它可能是 8 字节(如 Linux x86_64 下的情况)[^2]。 以下是几个常见平台的具体情况: | 平台 | short (byte) | int (byte) | long (byte) | |-----------------|--------------|------------|-------------| | Windows (x86/x64)| 2 | 4 | 4 | | Linux (x86) | 2 | 4 | 4 | | Linux (x86_64) | 2 | 4 | 8 | | ARM Cortex-M | 2 | 4 | 4 | | STC89C51 | 2 | 2 | 4 | 对于特定 MCU 或 MPU 系统,这些值可以通过查阅硬件手册或测试代码来确认。例如,通过下面这段代码可以打印出各类型的实际大小: ```c #include <stdio.h> int main() { printf("Size of short: %zu bytes\n", sizeof(short)); printf("Size of int: %zu bytes\n", sizeof(int)); printf("Size of long: %zu bytes\n", sizeof(long)); return 0; } ``` #### 示例分析 以引用中的例子为例,STC89C51 使用的是 16 位整型 (`int`),而 `long` 类型则占用 4 字节。这意味着该系统的 `sizeof(int)` 返回值为 2,而 `sizeof(long)` 则返回 4[^1]。 而在标准桌面环境中(如 GCC 编译器下的 x86 架构),`int` 占用 4 字节,`long` 在 32 位模式下也是 4 字节,但在 64 位模式下扩展到了 8 字节。 #### 影响因素 影响数据类型大小的主要因素包括但不限于以下几个方面: 1. **处理器架构**:不同架构的设计决定了基础数据单元的最小单位及其倍数关系。 2. **操作系统 ABI**:应用程序二进制接口规定了如何传递参数给函数调用以及栈帧布局等问题,从而间接影响到各种内置类型的尺寸设定。 3. **编译选项**:开发者可以选择启用特殊标志改变默认行为,比如 `-m32`/-`m64` 控制生成的目标文件针对哪种体系结构优化。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值