• 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---

  • 相关阅读:
    String与其他类型的转换
    Java并发(5):同步容器
    Java并发(4):ThreadLocal
    Java并发(2):Lock
    Java并发(1):synchronized
    Java并发之——线程池
    每天一个设计模式(7):单例模式
    Java集合(9):ConcurrentHashMap
    10 常用端口和Web 页面请求过程
    9 应用协议
  • 原文地址:https://www.cnblogs.com/RandyXu/p/2964806.html
Copyright © 2020-2023  润新知