单片机/C/C++八股:(五)32/64 位系统中,C/C++各变量类型所占字节数

上一篇下一篇
volatile 关键字

在 32 位和 64 位系统中,C 语言中各基本数据类型的大小并不完全由“32/64 位”决定,而是由 编译器 + 操作系统 + ABI(应用二进制接口) 共同决定。C++ 中基本数据类型的大小规则与 C 语言在相同平台和编译器下完全一致。其他编程语言(如 Java、Python)则通常有固定或抽象化的类型大小

1)总结表格

常见模型(以主流平台为例):

类型32 位系统(如 x86 Windows/Linux)64 位系统(LLP64 模型,Windows)64 位系统(LP64 模型,Linux/macOS)
char1 字节1 字节1 字节
short2 字节2 字节2 字节
int4 字节4 字节4 字节
unsigned int4 字节4 字节4 字节
long4 字节4 字节8 字节
unsigned long4 字节4 字节8 字节
long long8 字节8 字节8 字节
float4 字节4 字节4 字节
double8 字节8 字节8 字节
指针 (void*)4 字节8 字节8 字节

值范围( 位数 = 字节数 ∗ 8 位数=字节数*8 位数=字节数8):

  • 无符号类型: 0 ∼ 2 ( 位数 ) − 1 0\sim2^{(位数)}-1 02(位数)1

  • 有符号类型: − 2 ( 位数 − 1 ) ∼ 2 ( 位数 − 1 ) − 1 -2^{(位数-1)}\sim2^{(位数-1)}-1 2(位数1)2(位数1)1

  • 转换成 10 x 10^x 10x 的话,要取对数转换( l g 2 ≈ 0.3 lg2≈0.3 lg20.3,但小于),常用于题目给定 10 x 10^x 10x 的取值范围,我们需要确定变量类型的场景。例如:

    • 题目要求 0 < N < 10 9 0<N<10^9 0<N<109 ,则意味着变量的值要能覆盖此范围,首先选用 unsigned( ) 型,设其最大值为 2 x − 1 2^x-1 2x1,进一步令:

      ( 2 x − 1 ) > 10 9 → lg ⁡ ( 2 x − 1 ) > lg ⁡ ( 10 9 ) → lg ⁡ ( 2 x ) > lg ⁡ ( 2 x − 1 ) > lg ⁡ ( 10 9 ) → x lg ⁡ 2 > 9 → x > 9 lg ⁡ 2 由于  9 0.3 = 30 > 9 lg ⁡ 2 ,  则  x > 30  即可满足要求,则取  32 。 \begin{aligned} &(2^x-1)>10^9 \\ &\rightarrow \lg(2^x-1)>\lg(10^9) \\ &\rightarrow \lg(2^x)>\lg(2^x-1)>\lg(10^9) \\ &\rightarrow x\lg2>9 \\ &\rightarrow x>\frac{9}{\lg2} \\ &\text{由于}~\frac{9}{0.3}=30>\frac{9}{\lg2},~\text{则}~x>30~\text{即可满足要求,则取}~32。 \end{aligned} (2x1)>109lg(2x1)>lg(109)lg(2x)>lg(2x1)>lg(109)xlg2>9x>lg29由于 0.39=30>lg29,  x>30 即可满足要求,则取 32

      则取 unsigned int 即可,当然 int 也行。

2)如何在 C 中查看实际大小?

#include <stdio.h>
int main() {
    printf("int: %zu\n", sizeof(int));
    printf("long: %zu\n", sizeof(long));
    printf("void*: %zu\n", sizeof(void*));
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值