zoukankan      html  css  js  c++  java
  • C语言数据类型与表达式(进阶篇十六)

        。。。

      无符号整数的范围

        unsigned short的取值范围为0~65535。

        unsigned short占有2个字节,也就是16位,在计算机内部用(0000 0000 0000 0000)2表示0,用(1111 1111 1111 1111)2表示最大数。

        (1)2表示1,(11)2表示3,(111)2表示7……(1111 1111 1111 1111)2表示65535,刚好是21-1、22-1、23-1……216-1,得出无符号整型的计算公式为0~2n-1(n为整型位数)。

      补码

        补码中第一位表示正负数:0表示正数,1表示负数。  

        补码原理

     

        要求一个负数的补码,将它的绝对值二进制按位取反再加1,正数的补码是自己

        如求4位二进制数-3的补码:把(3)10=(0011)2按位取反得(1100)2,再加1得(1101)2,short型只是把4位扩展为16位(0000 0000 0000 0011)2,按位取反得(1111 1111 1111 1100)2,加1得(1111 1111 1111 1101)2

        16位二进制数-32768的补码:将32768转成二进制得(1000 0000 0000 0000)2,取反得(0111 1111 1111 1111)2,加1得 (1000 0000 0000 0000)2

        补码的特点是可以把减法运算转换成加法,比如一个4位二进制减法(0011)2-(0001)2在CPU中会先取得(0001)2的补码(1111)2,将此变成加法运算 (0011)2+(1111)2得到(10010)2,因为运算器只有4个位,前面的1舍去,得到正确结果(0010)2,这样CPU中就可以省去一个做减法运算的元件。

      

      不同类型的混合运算

        ※赋值语句中,等号两边类型不同时,以左边类型为准。

        如:

          int a=300;

          char b;

          b=a; /*不可预期的错误,但系统不会报错*/

        ※除法运算时,2/3的结果为0,2.0/3或者2/3.0结果都为0.66666……。这说明如果除号两边都是整数,结果只能是整数,除号两边有任意一个浮点数,结果就是精确的浮点数。

          混合运算时也遵循上述规律:

            double d=1.0+2/3;

          会先算2/3,这时答案已经是0,再加1.0,得到错误的结果1.0,改成

            double d=1.0+2/3.0;

          结果为1.666666,正确。

        ※char参与任何运算都会转换成ASCII码

        ※%(取余)不能用在浮点数上,它不会自动将浮点数转换成整数。

      强制转换

        格式:

          (类型名)表达式

        如:

          double d=(double)2/3+1.0;

          相当于double d=2.0/3+1.0;

          与double d=2/3.0+1.0;运算结果相同

  • 相关阅读:
    垃圾回收相关概念
    垃圾回收相关算法
    垃圾回收概述
    StringTable
    执行引擎
    [前端]背景图,中间放大特效
    [Javascript]类数组对象为什么不能用for in进行遍历
    [前端] 画个圈圈显示百分比
    win10 Build 14905.rs_prerelease.160811-1739 填坑记录
    [翻译][10 By 10 外文博客] 01.uwp获得关注并安装
  • 原文地址:https://www.cnblogs.com/httpcc/p/15420132.html
Copyright © 2011-2022 走看看