| 上一篇 | 下一篇 |
|---|---|
| volatile 关键字 |
在 32 位和 64 位系统中,C 语言中各基本数据类型的大小并不完全由“32/64 位”决定,而是由 编译器 + 操作系统 + ABI(应用二进制接口) 共同决定。C++ 中基本数据类型的大小规则与 C 语言在相同平台和编译器下完全一致。其他编程语言(如 Java、Python)则通常有固定或抽象化的类型大小。
1)总结表格
常见模型(以主流平台为例):
| 类型 | 32 位系统(如 x86 Windows/Linux) | 64 位系统(LLP64 模型,Windows) | 64 位系统(LP64 模型,Linux/macOS) |
|---|---|---|---|
char | 1 字节 | 1 字节 | 1 字节 |
short | 2 字节 | 2 字节 | 2 字节 |
int | 4 字节 | 4 字节 | 4 字节 |
unsigned int | 4 字节 | 4 字节 | 4 字节 |
long | 4 字节 | 4 字节 | 8 字节 |
unsigned long | 4 字节 | 4 字节 | 8 字节 |
long long | 8 字节 | 8 字节 | 8 字节 |
float | 4 字节 | 4 字节 | 4 字节 |
double | 8 字节 | 8 字节 | 8 字节 |
指针 (void*) | 4 字节 | 8 字节 | 8 字节 |
值范围( 位数 = 字节数 ∗ 8 位数=字节数*8 位数=字节数∗8):
-
无符号类型: 0 ∼ 2 ( 位数 ) − 1 0\sim2^{(位数)}-1 0∼2(位数)−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 lg2≈0.3,但小于),常用于题目给定 10 x 10^x 10x 的取值范围,我们需要确定变量类型的场景。例如:
-
题目要求 0 < N < 10 9 0<N<10^9 0<N<109 ,则意味着变量的值要能覆盖此范围,首先选用
unsigned( )型,设其最大值为 2 x − 1 2^x-1 2x−1,进一步令:( 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} (2x−1)>109→lg(2x−1)>lg(109)→lg(2x)>lg(2x−1)>lg(109)→xlg2>9→x>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;
}
3264 位系统中,CC++各变量类型所占字节数&spm=1001.2101.3001.5002&articleId=158878860&d=1&t=3&u=ca717c55949c4757963db01a9459a55b)
1万+

被折叠的 条评论
为什么被折叠?



