c语言|21_09_25 C语言杂谈

类型
c语言中规定类型这样一个事情,主要是出于一个怎样的原因呢?

charshortint longlong longfloatdouble

常规主要的类型,就是上面的几种类型
char类型常用于存储字符数据,数据宽度为8bit,唉?一个英文字符也是八个bit位就能存下,好像他这个设计很合理啊,但是呢,其实我们深究一下,他是不合理的,为啥呢,主要从两方面来说明问题,在32位的pc机前提下讨论。
1.你使用char类型在进行参数传递的时候,它实际还是按4字节传递的,最主要的原因是为了适应本机宽度的问题
2.对齐问题,我们所讨论的对齐,都是要基于硬件的,硬件不支持的话一切都是扯,那么char类型的对齐方式是按1字节对齐的,好像计算机也是最小访问一字节哈,但是问题就出在这里,cpu的最小对齐单位是word,也就是双字,那就意味着,一字节的对齐方式,只是cpu为我们做了适当的处理
当然,要出也是有的,就旦旦只是节省内存,经此而已。
float 也会默认转成 double 主要原因,一个是精度,一个是本机宽度
其他的几个类型,就不再赘述了,相信你已经悟到了!

符号问题
c语言中有有符号无符号的这种说法,好像对于我们的认知来说数确实是有正负的问题哈,很合理哈,但是问题就出在这里了,计算机怎么知道你是有符号还是无符号??计算机做加减法都仅仅只是做与或非操作而已,它并不能判断你的数究竟有无符号,0xFFFFFFFF你能说他是正数还是负数??0xFFFFFFFF 与0x12345678你能直接说他谁大谁小??这都是无法确定的,因为我无法确定你是把高位当符号位看还是不当符号位看,同样计算机也是无法确定,那么在cpu的角度来说,0xFFFFFFFF - 0x12345678究竟结果是正是负?无法确定,所以cpu把他即当无符号数也当有符号数,按无符号数的运算结果设置CF位,按有符号数的结果设置OF位,这下应该清楚为啥会有符号的说法了吧,其目的就是要让编译器能够准确无误的选择是使用根据OF位的进行操作的汇编指令,还是选择是使用根据CF位的进行操作的汇编指令,总结,c语言的符号设计是让程序员显示指导,消除歧义。

类型强转
他这个设计又是为了什么呢??说白了就是为了确定两个事情,一个就是转换数据宽度,一个就是转换步长,转换数据宽度就不再赘述了,转换步长
int *A; int *B; int *C;

现在又三个指针变量,那么他们现在的步长都是4个字节,现在我想让他每次的步长是两个字节,那么可以把他转换成 short* 类型,或者转换从(char (*)[2])类型,都是可以的,这个就是强转的意义


数组和指针
char * szp = “ABCDEF”; char szArr[] = "Hello World";


好像他俩没啥区别嚯,
char * szp = “ABCDEF”; char szArr[] = "Hello World"; //好像指针也可以通过数组的形式访问szp[i]; //好像数组也可以通过指针的形式访问*(szArr + i);

这事怕也也干的多了,好像也没啥问题,多级指针和多维数组好像也没有问题哈,确实一维数组和一级指针在这样的两种访问方式下确实是等价的,但是问题就出现在了多维数组和多级指针上
int***p;//用数组访问p[i][j][k]; ----------------------int Arr[i][j][k]; //用指针的形式访问*(*(*(Arr + m) +n) + v);

好像是我们平时这么使用是没啥问题哈,但是其实是他的本质已经发生变化了,事先说明一下。多维数组本质上和一维数组没区别,他的维数仅仅只是作为比例因子和偏移,拿来计算地址偏移用的,但是多级指针用数组访问的时候,他的维数仅仅只做偏移用,他的过程是加偏移,解引用,加偏移,解引用。。。。而数组以指针方式访问的时候,他的本质其实还是比例因子加偏移,他的 * 取值操作符,压根就没有取值,仅仅只是给你看看,让你比如那么慌,让你更好理解你所访问的值是哪个,仅此而已。

本人水平有限,有错的地方希望各位大佬指正;
【c语言|21_09_25 C语言杂谈】





    推荐阅读