C的整形变量在Turbo C、VC++、Linux下的大小

C语言中,整形变量在不同的编译环境下,其内存分配的大小是不相同的。ANSI C的标准没有规定标识符的长度,但各个C编译系统都有自己的规定。

在C里的整形变量:short、int、long,要求short型不长于int型,long型不短于int型。在TC环境下,short和int型被分配2字节(word),即16位(bit),long型是4字节,即32位。而在其它编译环境下int可能会被分配4字节,与long型相同。

如下是各个编译环境下为三种整形变量所分配的内存空间:

在Turbo C2.0:int 16、short 16、long 32;

在VC++ 6.0: int 32、short 16、long 32;

在Linux下: int 32、short 16、long 32;

为了验证自己所用的编译器为三种整形分配多大的内存空间,可以在当前编译环境下,写一段测试程序来测量它们的实际大小。

/*

查看C中的变量类型(int、short、long等)在Turbo C 里的大小。(方法一)

*/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
<font size="3">#include "stdio.h"
 
int main()
 
{
 
/*定义三种整形变量,为int、short的第16位负值1,long的第32位负1,其它位为0*/
 
unsigned int n_int=0x8000; /*n_int是int型变量*/
 
unsigned short n_short=0x8000; /*n_int是short型变量*/
 
unsigned long n_long=0x80000000; /*n_int是long型变量*/
 
unsigned size_int=16,size_short=16,size_long=32;
 
/*假设int、short型最小16位,long型最小是32位*/
 
while(1) /*默认死循环*/
 
{
 
n_int<<=1; /*n_int先左移一位*/
 
if(n_int!=0) size_int++; /*n_int不为0,说明原先16位的1没有溢出,
 
n_int还有更高位*/
 
else break; /*n_int为0,说明最高位1溢出,退出死循环*/
 
}
 
while(1) /*同上*/
 
{
 
n_short<<=1;
 
if(n_short!=0) size_short++;
 
else break;
 
}
 
while(1) /*同上*/
 
{
 
n_long<<=1;
 
if(n_long!=0) size_long++;
 
else break;
 
}
 
/*打印出三种类型变量所占内存的大小*/
 
printf("In This Suite :\n size_int = %d\n size_short = %d\n size_long = %d\n",size_int,size_short,size_long);
 
}
 
在Turbo C下,运行结果:
 
size_int = 16
 
size_short = 16
 
size_long = 32
 
在VC++_6.0下,运行结果:
 
size_int = 16
 
size_short = 32
 
size_long = 32
 
在Linux_redhat下,运行结果:
 
size_int = 16
 
size_short = 32
 
size_long = 32
 
</font>

由此可见,在不同编译环境下,为三种整形变量分配的字节数量不同,了解这些可以防止数据意外溢出,而导致错误,但这种错误通常编译器是不会报错的,这就形成透明错误,看不到但确实存在。

测试数据类型大小的方法很多,也可以用下面的方法:

/*

查看C中的变量类型(int、short、long等)在Turbo C 里的大小。(方法二)

*/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<font size="3">#include "stdio.h"
 
int main()
 
{
 
unsigned int n_int;
 
unsigned short n_short;
 
unsigned long n_long;
 
printf("In This Suite :\n num_int = %d\n num_short = %d\n num_long = %d\n",8*sizeof(n_int),8*sizeof(n_short),8*sizeof(n_long));
 
return 0;
 
}
</font>

这种方法比较简便,利用sizeof函数来帮你查出整形变量的大小,但需要注意sizeof函数返回的是字节数,需要乘以8来修正(一个字节占8位)。

posted @   大CC  阅读(3401)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
木书架 大CC的博客
点击右上角即可分享
微信分享提示