21_09_25 C语言杂谈

类型

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

char        

short        

int 
       
long        

long long

float

double

常规主要的类型,就是上面的几种类型

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语言,c语言)