第七章

第七章

  • 有符号整数溢出,程序行为是未定义的

  • 无符号整数运算过程中发生溢出,结果是有定义的:对2^n取模,n适用于存储结果的位数

  • C标准未说明char类型是有符号还是无符号型

  • 「惯用法」

    • while(getchar()!='\n');//skip rest of line
    • while((c=getchar())==' ');//skip blanks
  • C89算术类型

    • 整值类型
      • 字符类型 char
      • 有符号整型 signed charshort intintlong int
      • 无符号整型 unsigned charunsigned shortunsigned intunsigned long
      • 枚举类型
    • 浮点类型 floatdoublelong double
  • C99算术类型

    • 整数类型
      • 字符类型 char
      • 有符号整型 包括标准的(signed charshort intintlong intlong long int)和扩展的
      • 无符号整型 包括标准的( unsigned charunsigned short intunsigned intunsigned long intunsigned long long int_Bool)和扩展的
      • 枚举类型
    • 浮点类型
      • 实数浮点类型 floatdoublelong double
      • 复数类型 float_Complexdouble _Complexlong double _Complex
  • 以下情况进行隐式转换

    • 当算术表达式或逻辑表达式中操作数的类型不相同时(C语言执行所谓的常用算术转换
    • 当赋值运算符的右侧表达式类型与左侧变量的类型不匹配时
    • 当函数调用的实参类型与形参类型不匹配时
    • 当return语句中表达式的类型与函数返回值的类型不匹配时
  • 常用算术转换

    • 整值提升(integral promotion)把字符或短整型转换成int类型(如果int类型整数没有大到足以包含所有可能的原始类型值,那么是unsigned int

    • 任一操作数是浮点类型的情况。float->double->long double

    • 两个操作数均不是浮点类型。首先进行整值提升(保证没有一个操作数是字符类型或者短整型),然后int-> unsigned int-> long int-> unsigned long int。有一种特殊情况,在unsigned intlong int相同时,如果一个操作数是unsigned int,另一个是 long int,那么都被转换为unsigned long int

    • 当把有符号操作数和无符号操作数组合时,把有符号操作数“转换”成无符号的值。转换过程中需要加上或者减去n+1的倍数,n是无符号类型能表示的最大值。这条规则会导致一些隐蔽的编程错误。例:

      #include <stdio.h>
      int main(int argc, char **argv){
          unsigned int a=10;
          int b = -10;
      
          printf("yes, i am %d\n", b < a);
          printf("yes, i am %d\n", -10 < 10);
          return 0;
      }
      

      运行结果是:

      yes, i am 0
      yes, i am 1
      

      结论就是:尽量避免使用无符号整数!

  • 赋值过程中的转换

    • 常用算术转换不适用于赋值运算。C语言遵循另一条简单的转换规则,那就是把赋值运算符右侧的表达式转换为左侧变量的类型
    • 如果变量类型至少和表达式类型一样宽,那么转换没有任何障碍
    • 其他情况是有问题的。把浮点数赋值给整型丢掉小数部分。把某种类型的值赋给类型更狭小的变量时,如果该值在变量类型范围之外,那么会得到无意义的结果(甚至更糟)
  • C99中的隐式转换

    • 为了定义转换规则,C99允许每个整数类型具有“整数转换等级”。下面是从最高到最低的排序(这里忽略了扩展的整数类型和枚举类型)
      1. long long intunsigned long long int
      2. long intunsigned long int
      3. intunsigned int
      4. short intunsigned short int
      5. charsigned charunsigned char
      6. _Bool
    • C99用整数提升(integer promotion)取代了C89中的整值提升(integral promotion),可以将任何等级低于intunsigned int的类型转换为intunsigned int
    • 任一操作数是浮点类型的情况。只要两个操作数都不是复数类型,float->double->long double
    • 两个操作数均不是浮点类型。首先进行整数提升,如果两个操作数类型相同,过程结束。否则一次尝试以下规则,一旦遇到可应用的规则,就不再考虑其他的规则:
      1. 如果两个操作数均为有符号型或无符号型,将整数转换等级低的转换如为等级高的操作数类型
      2. 如果无符号操作数的等级高于或等于有符号操作数的等级,将有符号操作数转换为无符号操作数的类型
      3. 如果有符号操作数的类型可以表示无符号操作数类型的所有制,将无符号操作数转换为有符号操作数的类型
      4. 否则,将两个操作数都转换为与有符号操作数的类型相对应的无符号类型
  • 强制类型转换

    • 有时需要使用强制类型转换来避免溢出,例:
    long i;
    int j = 1000;
    i = j * j;//overflow may occur
    

    在有些机器上j*j的值过大,无法表示为int型,导致溢出。
    可以改为

    i = (long)j * j;

  • sizeof运算符

    • 编译器通常就能确定sizeof表达式的值,C99值变长数组不可以。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,527评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,314评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,535评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,006评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,961评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,220评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,664评论 3 392
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,351评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,481评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,397评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,443评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,123评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,713评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,801评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,010评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,494评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,075评论 2 341

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,836评论 6 13
  • 变量:在程序中存储数据项的地方(用序列号指定内存地址)是可以变化的,所以叫做变量(variable)名词:字节 字...
    全無阅读 503评论 0 3
  • 如何访问、如何引用、如何存储???? 问题:1、如何访问变量?通过变量名称来访问变量2、如何访问指针变量?通过指针...
    全無阅读 731评论 0 4
  • 第一类:逻辑型boolean 第二类:文本型char 第三类:整数型(byte、short、int、long) c...
    Jasonme阅读 1,062评论 0 4
  • 秋 思 晓来秋风起微凉 陌上菊花正欲黄 凭君若问故乡事 一河潍水清半江
    小女子弘文阅读 475评论 0 1