zoukankan      html  css  js  c++  java
  • C语言拾遗(一):整型提升

    开门见山,先来看一段简单的代码:

      1 #include <stdio.h>
      2 
      3 int array[] = {1, 2, 3, 4, 5, 6, 7};
      4 #define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
      5 
      6 int main()
      7 {
      8     int i = -1;
      9     int x;
     10 
     11     if(i <= TOTAL_ELEMENTS - 2) {
     12         x = array[i + 1];
     13         printf("x = %d.\n", x);
     14     }
     15 
     16     printf("now i = %d.\n", TOTAL_ELEMENTS);
     17 
     18     return 0;
     19 }

    执行结果:

    randy@ubuntu:~/C_Language$ ./a.out 

    now i = 7.

    是不是很奇怪?为什么没有打出line13的x = ?。

    是这样的。这个小例子有三点值得注意:

    1.sizeof()是运算符,返回类型是无符号的,即非负数。

    2.if语句在singned int和unsigned int之间进行判断语句,根据C语言的整型提升规则,如果原始类型的所有值都可用int类型表示,则其值将被转换为int类型;否则将被转换为unsigned int类型。因此此时的i将会被升级成无符号类型。

    3.i = -1被升级为无符号型,值究竟是多少?这要用到整型转换规则:K&R上这样解释,将任何整数转换为某种指定的无符号数类型数的方法是:以该无符号数类型能够表示的最大值加1为摸,找出与此整数同余的最小的非负值。听着很拗口,其实说白了,只要知道原整数的二进制表达方法,再用要即将转换的类型去解析,就得到升级后的值了。 比如-1,负数在计算机里用补码表示,0xffffffff,那升级成无符号型之后,值就是0xffffffff,显然比TOTAL_ELEMENTS(7)大。

    ---End---

  • 相关阅读:
    使用js方法时,调用的方法名明明一致,但就是不管用,解决
    最近ssh遇到异常及解决
    oracle中number数据类型简单明了解释
    Struts2 使用Jquery+ajax 文件上传
    PHP学习记录(二)
    PHP学习记录(一)
    Win7下Git SSH 创建Key
    webapck基础随手记
    分享一份JS前端面试题
    Redux零碎知识点回顾
  • 原文地址:https://www.cnblogs.com/RandyXu/p/2964806.html
Copyright © 2011-2022 走看看