C语言变量的基本类型有哪些?

说实话,当年我刚开始搞C语言那会儿,对这些类型真是摸不着头脑,尤其是char和int的位数问题。
我印象最深的是在大学实验室里调试一个简单的文本编辑器,突然发现输入的字符有时候会乱码,后来才知道是char类型的符号位处理不当。
这玩意儿挺绕的,char虽然是8 位,但最前面一位是符号位,所以能表示的负数范围其实比正数少一个,这就导致了-1 2 8 到1 2 7 这个范围。

有意思的是int类型的1 6 位表示。
我有个同事当年写了个小工具,处理一些1 6 位的硬件地址,结果他硬是用了int变量来存,导致负数溢出问题频发。
当时调试了三天,最后发现是int在编译器里默认1 6 位,直接把硬件地址当成了带符号整数。
这教训挺深刻,1 6 位int的范围是-3 2 7 6 8 到3 2 7 6 7 ,一旦超出这个范围,就会产生奇怪的问题。

浮点数这块儿更复杂。
我当年写一个物理模拟程序时,差点被float的精度坑死。
float只有2 3 位尾数,这意味着1 .3 3 3 3 3 这种数在计算机里只能近似表示。
当时我用了三个float变量相加,结果和单独相加完全不一样,最后改用double才搞定。
这让我明白float适合快速计算,但不适合需要高精度的场合。
double虽然6 4 位,精确度提升明显,但计算速度会慢不少。

unsigned、short、register这些修饰符也挺有意思。
我有个项目内存特别紧张,就用了short来替代int,结果发现某些编译器会把short优化成8 位,直接导致溢出问题。
还有unsigned,当时我写个循环计数器,用了unsigned int,结果超出最大值后居然从0又开始了,把我搞得怀疑人生。
register就更玄乎了,我试过把频繁使用的变量用register修饰,结果在某些编译器里性能并没有提升,估计是寄存器资源本身就够用。

typedef这块儿我倒是用得挺顺手。
我经常用typedef给一些临时变量起个外号,比如typedef unsigned long int ul;,这样ul temp;写起来就特别简洁。
不过有一次我忘了ul到底是什么类型,硬是写了个ul = -1 ;,结果发现unsigned long int居然能表示0到4 2 9 4 9 6 7 2 9 5 ,直接把负数当正数处理了,差点把整个数据结构搞崩。

这些类型细节确实挺磨人的,但搞懂了之后写代码就会更得心应手。
我建议你多写写不同类型的变量,尤其是边界条件,比如char的最大负数和最大正数,int的溢出行为,这样以后用起来就不会手忙脚乱了。

C语言变量定义char、int、long有什么区别?

结论: 1 、char占用1 字节,范围-1 2 8 至1 2 7 ,用于字符存储,ASCII值。
2 、int在1 6 位占2 字节,3 2 /6 4 位占4 字节,范围-2 ^3 1 至2 ^3 1 -1 3 、long在3 2 位占4 字节同int,6 4 位占8 字节,范围-2 ^6 3 至2 ^6 3 -1 4 、C语言,1 9 7 8 年AT&T贝尔实验室发布,标准由K&R书定义,结构化、值传递、指针、结构体、3 2 个关键字、类型转换。
5 、C语言能直接操作内存,预处理器增强灵活性。

c语言中变量的使用方法

等等,还有个事,我上次在写一个学生管理系统的时候,用全局变量来记录学生总数,在头文件里声明了 extern int student_count; 然后在每个源文件里通过 extern 声明来引用,这样就不会出现重复定义的问题。
不过后来发现,如果多个文件同时修改这个全局变量,可能会有线程安全问题,那时候我就开始考虑用互斥锁来保护它了。
不过,那个项目后来因为预算问题被砍了,所以也没真正实现。

c语言变量是什么意思

等等,昨天整理书架时,发现一本旧C语言教材,封皮都磨损了。
翻开目录,看到“变量”这一章,突然想起当年第一次写程序时遇到的困惑。

那时候我还是个高中生,在学校的电脑房里,屏幕是绿字黑底的单色显示器。
老师教我们用C语言写一个简单的程序,输出“Hello World”。
但老师强调,要先声明一个变量,比如int count = 0;,然后再用printf函数输出。
当时我有点懵,觉得直接写printf("Hello World");不就好了吗?老师耐心解释说,变量就像一个盒子,你要先告诉计算机这个盒子的名字(比如count),里面装什么类型的东西(int是整数),然后才能往里放东西(count = 0),最后才能取出来用。
这个“盒子”的概念,我琢磨了好久才理解。

后来写一个计算圆面积的程序,需要存储圆的半径,就声明了float radius = 5 .0f;。
每次修改半径值,面积跟着变,感觉特别神奇。
那时候用的还是DOS系统,编译运行后,屏幕上立刻显示出计算结果,比计算器还快。

再后来,大学里学数据结构,发现变量不仅要存储数据,还要考虑内存分配。
比如char类型只占1 字节,而double可能占8 字节,用多了就要注意内存效率。
我记得当时写一个链表程序,如果变量声明太多或者太大,程序运行就卡顿,甚至崩溃。
那时候用的是WinXP系统,编译器是Turbo C,每次编译都要等半天,屏幕上全是红绿相间的编译信息。

现在想起来,变量确实是编程的基础,就像搭积木一样,没有基本的积木块,怎么搭出复杂的结构?但有时候又觉得,现在的编程语言越来越高级,很多变量操作都封装好了,程序员好像不用再关心这些底层细节。
就像现在用Python,直接用a = 1 0就完事了,不用管它是存储在栈还是堆里。

不过,最近看一个关于嵌入式开发的博客,说在单片机上编程,内存只有几KB,变量用多了就要小心溢出。
那时候的变量,简直是用一分一毫的内存换来的。
这让我突然想到,不管技术怎么发展,变量这个概念,可能永远都是编程的基石吧。
只是具体怎么用,得看情况了。