一、基本类型的大小及范围的总结(以下所讲都是默认在32位操作系统下):
字节:byte;位:bit。
1.短整型short:所占内存大小:2byte=16bit;
所能表示范围:-32768~32767;(即-2^15~2^15-1)
2.整型int:所占内存大小:4byte=32bit;
所能表示范围:-2147483648~2147483647;(即-2^31~2^31-1)
unsigned: 所占内存大小:4byte=32bit;
所能表示范围:0~4294967295;(即0~2^32-1)
3.长整型long:所占内存大小:4byte=32bit;
所能表示范围:-2147483648~2147483647;(即-2^31~2^31-1)
unsigned long: 所占内存大小:4byte=32bit;
所能表示范围:0~4294967295;(即0~2^32-1)
注:上面所说的全部是有符号型的,short,int,long都默认为有符号型,其中long和int都占4个字节的空间大小,他们有什么区别呢?
16位操作系统:long:4字节,int:2字节
32位操作系统:long:4字节,int:4字节
64位操作系统:long:8字节,int:4字节
int型在不同位数操作系统中所占用的字节数不同,如果想编写可移植性好的程 序,早年流行16位和32位操作系统时最好用long修饰int型,现在流行32位和64 位操作系统,用int就挺多了。当然这些都看你怎么去理解它了,毕竟它们在不 同操作系统所占字节数不固定,所以各自都有其适用之处,不可定论其好坏。 下面是对它们的有科学依据的规定:
C语言规定:无论什么平台都要保证long型占用字节数不小于int型,int型不小于 short型。
4.字符型char:所占内存大小:1byte=8bit;
所能表示范围:不确定!!!!;
unsigned char:所占内存大小:1byte=8bit;
所能表示范围:0~255;(0~2^8-1)
singned char: 所占内存大小:1byte=8bit;
所能表示范围:-128~127;(-2^7~2^7-1)
char的默认类型不确定有可能是unsigned,也有可能是signed,主要更具编译器而定,可以自己测试一下编译器的默认char的符号类型。
5.布尔类型bool:所占内存大小:1byte=8bit;
所能表示的范围:只能取两个值false或者true;所以最小值就是:0,最大值:1.
6.单精度float: 所占内存大小:4byte=32bit;
所能表示的范围:(1.17549e-038)~(3.40282e+038);//注意:浮点数在内存中都是按科学计数法来存储的,浮点数的精度是由尾数的位数决定的,大家记住即可不 必深究;
7.双精度double:所占内存大小:8byte=32bit;
所能表示的范围:(2.22507e-308)~(1.79769e+308);
注:如何区分和使用这两个浮点类型呢,首先float和double的精度不同,float保留到小数点后面7位,而double保留到小数点后面16位,float能保证6位有效数字,而double能保证15位有效数字,如果在不追求精度的的情况下当然用float比较好,节省内存,如果需要很高的精度的情况下,最好还是用double,平时我们定义浮点型变量一般都用double,毕竟精度高,一般精度的损失是不能忽略的。
8.字符串string:由于string在c++中属于类类型,不是基本数据类型,类不能计算其在内存中所占大小,非要用sizeof(string)来算的话,一般算出来的结果是sizeof(string)=4byte, 如果string字符串内容很多,很明显就不是其真实大小,string类里面有计算其字节大小的函数如:size(),length()。
【唯一讲明白的】CSS中position属性( absolute | relative | static | fixed )详解
怎么样,是不是还是很迷糊~~ 没关系,下面就从几个基础概念一一给大家详述:
什么是文档流?
将窗体自上而下分成一行行, 并在每行中按从左至右的顺序排放元素,即为文档流。
只有三种情况会使得元素脱离文档流,分别是:浮动、绝对定位和固定定位。
静态定位(static) :
static,无特殊定位,它是html元素默认的定位方式,即我们不设定元素的position属性时默认的position值就是static,它遵循正常的文档流对象,对象占用文档空间,该定位方式下,top、right、bottom、left、z-index等属性是无效的。
相对定位(relative) :
relative定位,又称为相对定位,从字面上来解析,我们就可以看出该属性的主要特性:相对。但是它相对的又是相对于什么地方而言的呢?这个是个重点,也是最让我迷糊的一个地方,现在让我们来做个测试,我想大家都会明白的:
(1) 初始未定位
[html]
/******初始*********/ #first{width:200px;height:100px;border:1pxsolidred;} #second{width:200px;height:100px;border:1pxsolidblue;} first second
初始原图:
(2) 我们修改first元素的position属性:
[html]
#first{width:200px;height:100px;border:1pxsolidred;position:relative;top:20px;left:20px;}/*addposition*/ #second{width:200px;height:100px;border:1pxsolidblue;}
相对偏移20px后:
-- >> 虚线是初始的位置空间
现在看明白了吧,相对定位相对的是它原本在文档流中的位置而进行的偏移,而我们也知道relative定位也是遵循正常的文档流,它没有脱离文档流,但是它的top/left/right/bottom属性是生效的,可以说它是static到absoult的一个中间过渡属性,最重要的是它还占有文档空间,而且占据的文档空间不会随 top / right / left / bottom 等属性的偏移而发生变动,也就是说它后面的元素是依据虚线位置( top / left / right / bottom 等属性生效之前)进行的定位,这点一定要理解。
那好,我们知道了top / right / left / bottom 属性是不会对relative定位的元素所占据的文档空间产生偏移,那么margin / padding会让该文档空间产生偏移吗?答案是肯定的,我们一起来做个试验吧:
(3) 添加margin属性:
[html]
#first{width:200px;height:100px;border:1pxsolidred;position:relative;top:20px;left:20px;margin:20px;}/*addmargin*/ #second{width:200px;height:100px;border:1pxsolidblue;}
设置margin:20px后:
对比一下,是不是就很清晰了,我们先将first元素外边距设为20px,那么second元素就得向下偏移40px,所以margin是占据文档空间!同理,大家可以自己动手测下padding的效果吧!
绝对定位(absoulte) :
absoulte定位,也称为绝对定位,虽然它的名字号曰“绝对”,但是它的功能却更接近于"相对"一词,为什么这么讲呢?原来,使用absoult定位的元素脱离文档流后,就只能根据祖先类元素(父类以上)进行定位,而这个祖先类还必须是以postion非static方式定位的, 举个例子,a元素使用absoulte定位,它会从父类开始找起,寻找以position非static方式定位的祖先类元素(注意,一定要是直系祖先才算哦~),直到标签为止,这里还需要注意的是,relative和static方式在最外层时是以标签为定位原点的,而absoulte方式在无父级是position非static定位时是以作为原点定位。和元素相差9px左右。我们来看下效果:
(4) 添加absoulte属性:
[html]
html{border:1pxdashedgreen;} body{border:1pxdashedpurple;} #first{width:200px;height:100px;border:1pxsolidred;position:relative;} #second{width:200px;height:100px;border:1pxsolidblue;position:absolute;top:0;left:0;} relative absoult
效果图:
哈哈,看了上面的代码后,细心的朋友肯定要问了,为什么absoulte定位要加 top:0; left:0; 属性,这不是多此一举呢?
其实加上这两个属性是完全必要的,因为我们如果使用absoulte或fixed定位的话,必须指定 left、right、 top、 bottom 属性中的至少一个,否则left/right/top/bottom属性会使用它们的默认值 auto ,这将导致对象遵从正常的HTML布局规则,在前一个对象之后立即被呈递,简单讲就是都变成relative,会占用文档空间,这点非常重要,很多人使用absolute定位后发现没有脱离文档流就是这个原因,这里要特别注意~~~
少了left/right/top/bottom属性不行,那如果我们多设了呢?例如,我们同时设置了top和bottom的属性值,那元素又该往哪偏移好呢?记住下面的规则:
既然absoulte是根据祖先类中的position非static元素进行定位的,那么祖先类中的margin/padding会不会对position产生影响呢?看个例子先:
(5) 在absoulte定位中添加margin / padding属性:
[html]
#first{width:200px;height:100px;border:1pxsolidred;position:relative;margin:40px;padding:40px;} #second{width:200px;height:100px;border:1pxsolidblue;position:absolute;top:20px;left:20px;} first second
效果图:
看懂了,祖先类的margin会让子类的absoulte跟着偏移,而padding却不会让子类的absoulte发生偏移。总结一下,就是absoulte是根据祖先类的border进行的定位。
Note :绝对(absolute)定位对象在可视区域之外会导致滚动条出现。而放置相对(relative)定位对象在可视区域之外,滚动条不会出现。
固定定位(fixed):
fixed定位,又称为固定定位,它和absoult定位一样,都脱离了文档流,并且能够根据top、right、left、bottom属性进行定位,但不同的是fixed是根据窗口为原点进行偏移定位的,也就是说它不会根据滚动条的滚动而进行偏移。
z-index属性:
z-index,又称为对象的层叠顺序,它用一个整数来定义堆叠的层次,整数值越大,则被层叠在越上面,当然这是指同级元素间的堆叠,如果两个对象的此属性具有同样的值,那么将依据它们在HTML文档中流的顺序层叠,写在后面的将会覆盖前面的。需要注意的是,父子关系是无法用z-index来设定上下关系的,一定是子级在上父级在下。
Note:使用static 定位或无position定位的元素z-index属性是无效的。