【文章摘要】int类型的数据是我们认知上最基本的类型,一般int类型二进制的表示长度和cpu的位宽(就是上面说的那排线的数量)一样,比如cpu位宽是32位,int也是32位,8位一个字节,int就是4字节。
我们平时从手机或是电脑上看到的各种数字或是文字都是由一定的数据类型表示的,比如我们看到的各种整数类型2,5,100等在计算机中的数据类型是int,各种带小数的2.15,3.14等数据类型则是float(当然数据类型不止这些)。
因为数据在计算机中是用二进制来表示,二进制本身是很自由不限长度的,比如2的二进制是10,9的二进制是1001,但是计算机中为了保证cpu的处理效率,需要按照一定的长度给cpu喂数据,关于数据长度,你可以想象有一排管线连着cpu,这排管线中塞了一排0,1组成的数据,不断的传给cpu处理。很多同学经常听说什么32位的机器,64位的机器,但是不知道具体是啥意思,其实可以认为就是这排管线的数量,32机器就有32根线,64位就有64根线。管线越多,一次能喂给cpu的数据就能越多,吞吐速度就越快(这样说不太科学,只是方便理解)。
int类型的数据是我们认知上最基本的类型,一般int类型二进制的表示长度和cpu的位宽(就是上面说的那排线的数量)一样,比如cpu位宽是32位,int也是32位,8位一个字节,int就是4字节。但数字表示的范围那么大,还有小数这种小数点两头都能发展的数,自然需要更多的数据类型来表示了,比如double,float这种用来增大表示范围和表示形式的数据类型了,当然也有byte,short这种缩小表示范围的数据类型了。无论范围扩大或缩小,不同的数据类型之间也有表示范围重叠的部分,比如byte,int,float,double都可以用来表示3这个数字。
因为不同的数据类型最终都是用二进制来表示的,所以它们之间是可以互相转换的,比如觉得用int的4个字节来表示的3有点大材小用,也可以转换成用byte来表示,这样只需要用1个字节,计算机处理这种数据类型转换时的字节变化也是简单粗暴,长的变短就腰斩,短的变长就用补位,变长没有问题,只是加0补位,没有改变原来的值,但是长的变短就有风险了,如果斩掉的部分还有有效值,那就会导致数据丢失了。
讲了这么多枯燥的东西,我们来看看实际场景中遇到的坑吧。产品MM给开发GG提了一个需求————统计一下页面的请求来源,产品MM说:“我们用1,2,3...来约定吧,分别表示来自xx,yy,zz...发来的请求"。开发GG一拍胸:“小case”。开发测试上线很顺利,产品MM很开心。可是过了没多久,产品MM就来质问开发GG:“怎么后台统计的数据乱七八糟了?”,具体互相撕逼的段子就不写了,来说说原因吧,原来开发GG听到这个需求时,看到了产品MM列举的一些数字,看到都不大,就自作聪明的将来源值转成了byte来存储和上报,认为自己这样做节省了存储空间,还减少了上报的流量,减少了服务器压力。测试的时候用的也都是些1,2,3这样的数据,当然都很顺利的通过了。业务膨胀的很快,分配的数字也越来越大,结果有些来源分配的一些比较大的数字被转成byte数据类型后发生了腰斩,都上报到byte表示范围的那些来源里去了......
产品MM说的"1,2,3..."其实暗指是1到无穷大,而开发GG看到的"1,2,3..."就真的是产品MM告诉他的那几个"1,2,3...10,11"了,两边都以为对方理解了。如果不知道数据类型的表示长度,互相转换,产品MM肯定会觉得这都能出问题也是醉了,也不会想到用个大点的数试试。开发GG也是太追求数据类型对内存、传输的消耗而弄巧成拙。
登录 | 立即注册