C语言进阶教程(一)(转自Peter Fačka)

                     C语言进阶教程

        C语言是系统编程,嵌入式系统编成的语言,同时也是许多应用程序的选择。如果想对计算机编程有严肃的兴趣又不接触C语言似乎是不可能的。全方位的理解C语言和它”阴暗“的角落尤其是个挑战。这篇文章试着去提供浅显的实例来阐释C语言的一部分。包括:整型提高,内存分配,数组与指针变换,明确的内联,插值和矢量交换。

 

整体溢出与提升

 

  大多数C程序员倾向于假定整型的基本操作是安全的。事实上,这很容易出问题,考虑一下如下代码:

int main(int argc, char** argv) {

    long i = -1;

    if (i < sizeof(i)) {

         printf("OK\n");

    }

    else {

         printf("error\n");

    }

    return 0;

  当变量i被转成无符号整型会发生什么。由于sizeof运算,因此它的值不再是-1,而是size_t的最大值(原文如此)。发生这种变化的原因在C99/C11标准的”通常算法转换“一章中有描述:

“如果运算对象有无符号整型的值不小于其他运算对象,则有符号整型的运算对象将被转换成无符号整型。”

C标准定义size_t为最少16 bits的无符号整型。通常情况下size_t与给定架构的长一致。这使得int型的长度至少与size_t相同,上述规则强制转化int为无符号整数。

这给了我们整型长度的可移植性问题。C标准并没有明确的规定short,int,long,long long和他们的无符号形式的长度。只有强制性的最小长度。举个例子,x86_62架构,long型在Linux里是64-bits但在64位Windows下是32-bits。让代码更具移植性的一般方法是用长度特定化的变量如C99的stdint.h头文件中定义的uint16_t或者int32_t。它定义了三种长度的整型变量:

有明确特殊的长度:uint8_t,uint16_t,int32_t,等等。

带有特殊长度的最小变量:uint_least8_t,uint_least16_t,int_leasr32_t等等。

有特殊长度的最高效的变量:uint_fasr8_t,uint_fast16_t,int_fast32_t等等。

 

不幸的是,使用stdint.h不能保护我们原理所有问题。C标准的”完整提升法则“中说:

如果一个整型变量可以代表所有原型变量的值,值被转变为整型变量,否则值被转变为无符号整型变量。这些都叫做整型提高,所有其他种类不被整型提高改变。

因此下面的代码在32位平台上返回65536,而在16位平台上返回0。

uint32_t sum()

{

    uint16_t a = 65535;

    uint16_t b = 1;

    return a+b;

}

  整型提高保护值和符号。无论一个“简单的”字符变量是否被以“已经定义”对待。

  字符变量如何实现通常根据硬件架构或者OS,它通常被特别平台的ABI规定。如果你想自己找出来的话,万一char变为了signed char,下面的代码会打出-128,-127(x86架构),否则会打出128,129。GCC有funsigned-char转换来在x86架构上进行强制无符号。

char c = 128;

char d = 129;

printf("%d,%d\n",c,d);


如有任何见解与建议欢迎发送邮件至:frank.tancf@gamil.com

原文转自:http://pfacka.binaryparadise.com/articles/guide-to-advanced-programming-in-C.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很多同学对咱们C语言的课程、学习存在着很多误解,而且很多同学还不知道《C语言高级教程》后面的课程安排是什么,因此这里一并做一个说明。有同学问“别人都说开发数据库系统、Web系统还是Java、C#等最流行,咱们用C语言学了开发也不是浪费吗?”、“C语言不是做嵌入式开发、操作系统等底层的东西吗?”、“我们为什么不讲C语言的嵌入式开发?”、“人家都学Web开发,咱们这学C语言开发C/S的程序不是落伍了吗?”。 确实在实际工作中,由于C语言的门槛比较高,很少有实际项目用C语言进行数据库系统、Web系统等的开发的。但是我不止一次强调“学习时学东西和工作时学东西是不一样的”。 工作以后选用的技术、语言一定是选择做合适、最方便做所从事方面的,比如开发Web程序肯定首选PHP、Java、.net,开发底层系统肯定首选C/C++,开发桌面系统肯定首选VB、Delphi,也就是“用合适的语言做合适的事情”; 但是对于在校生来说则是“用最熟悉的语言做所有事情”。初学编程的人最容易在语言的表层陷入 太长时间,如果要学数据库开发了就要去学Delphi、PB,又要学Web开发了就又去学Java、.net,又要学底层开发了就又去学C/C++, 可是每门语言都没深入,最后真正要学的数据库开发、Web开发、底层 开发等等没怎么学会,倒是把大量的时间浪费在学这些基础语法上,浪费了宝贵的时间, 这也是我痛 恨目前很多大学课程安排的一个原因。因此我的倡导就是对于在校生来说则是“用最熟悉的语言做所 有事情”,我甚至建议大学只学一门C语言就够了,然后就教大家用C语言做所有的方面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值