这是一个普遍的问题,与c编程语言没有完全相关,但这正是我目前正在研究的问题。
为什么整数占用4个字节或者多少字节依赖于系统?
为什么每个整数不占用1个字节?
例如,为什么以下占用8个字节:
int a = 1;
int b = 1;
由于
答案 0 :(得分:4)
我不确定您是在问为什么int
个对象具有固定大小而不是可变大小,或者您是否在问为什么int
个对象具有固定大小。这回答了前者。
我们不希望基本类型具有可变长度。这使得与它们合作变得非常复杂。
我们希望它们具有固定的长度,因为生成指令以操作它们要容易得多。此外,操作会更快。
如果int
的大小可变,请考虑以下情况:
b = 3;
b += 100000;
scanf("%d", &b);
首次分配b
时,只需要一个字节。然后,当执行添加时,编译器需要更多空间。但b
可能在内存中有邻居,因此编译器不能只在适当的位置增长它。它必须释放旧内存并在某处分配新内存。
然后,当我们执行scanf
时,编译器不知道要传输多少数据。 scanf
必须做一些非常复杂的工作,一遍又一遍地增长b
,因为它会读取更多数字。并且,完成后,它如何让您知道新b
的位置?编译器必须有一些机制来更新b
的位置。这很复杂,会引起其他问题。
相反,如果b
具有四个字节的固定大小,则这很容易。对于作业,请将3写入b
。要添加,请在b
中为值添加100000,并将结果写入b
。对于scanf
,将b
的地址传递给scanf
,然后将新值写入b
。这很容易。
答案 1 :(得分:1)
基本积分类型int
保证至少有16位;至少意味着编译器/体系结构也可以提供更多位,并且在32/64位系统int
上最可能分别包括32位或64位(即4字节或8字节)(例如,参见cppreference.com):
整数类型
... int(也可以作为signed int访问):这是最优的 平台的整数类型,保证至少为16 位。大多数当前系统使用32位(参见下面的数据模型)。
如果您想要一个只有8位的整数类型,请使用int8_t
或uint8_t
。
答案 2 :(得分:0)
没有。它是实现定义的。例如,Atmel 8位微控制器上的signed int
中的gcc
是16位整数。 unsigned int
也是16位,但是从0-65535开始,因为它是无符号的。
答案 3 :(得分:0)
<div id="mapDiv">
<svg id="mapSVG" width="960" height="600" viewbox="0 0"></svg>
</div>
使用固定数量的字节(例如4)这一事实是编译器/ CPU的效率和限制,旨在使公共整数操作快速有效。
有些类型(例如Java中的var svg = d3.select("#mapSVG"),
width = +svg.attr("width"),
height = +svg.attr("height");
)占用了可变的空间量。这些类型将有2个字段,第一个是用于表示整数的字数,第二个是字数组。您可以定义自己的#mapDiv{
border: 2px solid #000;
border-radius: 7px;
float: left;
width: 50%;
}
#mapSVG{
display: block;
margin: auto;
}
类型,例如:
int
等等,但执行算术运算速度不是很快。您必须决定如何处理溢出;调整存储大小需要动态内存分配。