运算符和表达式,循环者遭逢了狼人

利用个中变量调换五个int型变量的值:

思多雅[天行健] 发布时间:二零一零.11.0玖
   
在眼下的多少个章节中,我们上学了C#的基本概念,那一章,大家来学习C#的档次与变量。
    C#语言的连串被分成三类:数值类型、引用类型和指针类型。
       type:
           value-type
           reference-type
           poin ter-typ e
   
注意:指针类型只好用在不安全代码,咱们在背后的章节中会实行专门的议论。
   
数值类型与引用类型所不一样的是,数值类型变量直接含有它们的数据,但是引用类型的变量存储对它们的数量的引用,即是背后要介绍的指标。对于引用类型,大概会冒出多个变量引用相同对象的情事,那样对于3个变量的的操作就有望影响到由其他变量引用的目的。对于数值类型,每一个变量都有它们自身对数码的正片,那样就不容许出现贰个对变量的操作影响到其余二个的情状。
   
C#的档次系统是联合的,那样任何类型的多寡都得以被看成对象。C#中的任何项目都一直或间接地从objiect
类类型派生,而object
是独具品类的最核心类类。引用类型的数值被当作通过对象,这几个目的通过把数值作为类型对象来简化。数值类型的数值通过包装和平化解包操作来被看作对象。

一.C语言数据类型

谜题3三: 循环者碰到了狼人
    请提供2个对i表明,将下边包车型地铁循环转变为极其循环。
    while (i != 0 && i == -i)
    {
    }

int a = 29;

int b = 10;

a = a+b;

b = a-b;

a = a-b;

-------思多雅[天行健]版权全部,首发太平洋论论坛,转发请注脚-------

亚洲必赢官网 1

应对3三: 循环者碰到了狼人
    那还是是二个循环往复。在布尔表达式(i != 0 && i ==
-i)中,一元减号操作符功用于i,意味着它的项目必须是数字的:壹元减号操作符成效于二个非数字预定义类型操作数是违规的。因而,我们要物色2个非0的数字类型数值,它相当于本人的负值。NaN不能满足这天天性,因为它不等于任何数值,由此,i必须代表2个实际上的数字。分明未有任何数字满意如此的品质吗?
   
嗯,未有此外实数具有那种性格,可是尚未任何1种C#数字类型能够对实数实行宏观建立模型。浮点数值是用多少个标志位、一个被伊始地称呼尾数(mantissa)的可行数字以及三个指数来代表的。除了0之外,未有别的浮点数等于其标志位取反之后的值,因而,i的档次必然是整数的。
   
有记号的整数类型应用二的补码算术运算:为了赢得三个数值的负值,要对其每一人取反,然后加一,从而赢得结果。二的补码算术运算的一个十分的大优势是,0具有唯一的象征方式。假使要对int数值0取负值,将收获0xffffffff+一,它照旧是0。可是,那也有多个相应的缺陷。总共存在偶数个int数值——准确地说有二32个,当中3个用来表示0,剩下奇数个int数值来代表正整数和负整数,那意味着正的和负的int数值的数码肯定不等于。换句话说,那暗示着至少有二个int数值,其负值不能够正确地代表为int数值。
   
事实上,恰恰就有2个如此的int数值,它正是int.MinValue,即-二31。它的十陆进制表示是0x70000000。其标志位为壹,别的具备的位都以0。假若我们对那一个值取负值,将获得0x7fffffff+一,也正是0x九千0000,即int.MinValue!换句话说,int.MinValue是它和谐的负值,long.MinValue也是同一[C#语言专业
七.陆.二]。对那八个值取负值将产生溢出,但是C#在整数总结(unchecked上下文)中忽略了溢出。其结果早就解说清楚了,固然它们并不三番五次你所期望的。
    上边包车型客车宣示将使得布尔表明式(i != 0 && i ==
-i)的盘算结果为true,从而使循环Infiniti循环下去:
    int i = int.MinValue;
    上面那个也能够:
    long i = long.MinValue;
   
假若你对取模运算很熟习,那么有至关重要提议,也得以用代数方法解决这几个谜题。C#的int算术运算是实际的算术运算对二32取模,因而本谜题要求3个对那种线性全等的非零化解方案:
    i ≡ -i(mod 232)
    在恒等式的两边加i,能够收获:
    2i ≡ 0(mod 232)
    对那种全等的非零消除方案便是i =
231。固然那一个值不能够代表成int,不过它和-贰31是全等的,即与int.MinValue全等。
   
总之,C#选择二的补码的算术运算,是不对称的。对于每1种有号子的平头类型(int、long、sbyte和short),负的数值总是比正的数值多一个,那个多出去的值总是那种类型所能表示的细小数值。对int.MinValue取负值不会变动它的值,long.MinValue也是这么。对short.MinValue取负值并将所发出的int数值转型回short,再次回到的等同是早期的值(short.MinValue)。对sbyte.MinValue来说,也会发生相似的结果。更相像地讲,纯属要警惕溢出:就像是狼人壹样,它是个徘徊花。    
对语言设计者的教训与谜题二六中的教训壹样。思量对某种不会偷偷发生溢出的平头算术运算情势提供语言级的支持。
    (注:在C#的checked上下文少将进行溢出检查[C#语言专业
柒.五.12])

 

一、C#的数值类型
   
数值类型既是二个组织类型也是枚举类型。C#提供了一种种预约义结构类型,称为简单类型。简单类型通过保留字钦命,并且一发分成数字类型,整数类型和浮点数类型。
       value-type :
           struct-typ e
           enum-type
       struct-typ e:
           type-name
           simp le-type
       simp le-type :
           numeric-type
           bool
       numeric-type :
           integral-type
           floa ting-point-type
           decimal
       integral-type :
           sbyte
           byte
           short
           ushort
           int
           uint
           long
           ulong
           char
      floa ting-point-type:
         float
         double
      enum-type :
         type-name
    全部数值类型都隐式地从类object
继承。不允许其余项目从数值类型派生,因此数值类型是被默许封闭的。
   
一个数值类型的变量日常包涵四个那体系型的数值。不像引用类型,数值类型的数值无法为null
或是引用二个尤为派生类型的变量。
   
对有些数值类型的变量赋值就会成立二个对所赋数值的正片,它复制了引用而不是援引所钦赐的靶子。

image.png

   
C#回答总目录

相信大家很简单写出来,但思念到边界值意况时会有一对幽默的业务。

一.1 暗中同意构造函数
   
所有项目都隐含地评释了八个共用的无参数的构造函数,称为暗中同意构造函数。默许构造函数再次回到一个初叶值为零的实例,为数值类型的默许数值:
  对于有着单独项目,暗中认可数值是由1个零位格式发生的数值:
 
对于sbyte、byte、short、ushort、int、uint、long和ulong,暗许的数值为0。
  对于char,暗中同意的数值为’\x0000’。
  对于float,默许的数值是0.0f。
  对于double,暗中认可的数值为0.0d。
  对于decimal,暗中同意的数值为0.0m。
  对于bool,暗许的数值为false。
  对于三个枚举类型E,暗中同意数值是0。
 
对于协会类型,暗许数值是把具有数值类型域设为它们的暗中同意类型并且把富有引用类型域设为null的数值。
    像别的任何构造函数一样,叁个数值类型的暗中同意的构造函数用new
操作符调用。在下边包车型客车事例中,变量i 和j 都起来化为0。
      class A
      {
         void F() {
            int i = 0;
            int j = new int();
          }
      }
   
如上所示,因为各种数值类型涵盖的都有公共无参数构造函数,所以让一个体协会会类型涵盖一个外表注解的无参数构造函数是不容许的。三个结构类型能够允许注明一(Wissu)个参数化的构造函数。例如
      struct Point
      {
         int x, y;
public Point(int x, int y) {
             this.x = x;
             this.y = y;
           }
       }
运算符和表达式,循环者遭逢了狼人。    要是已经提交上边的宣示,那么语句
       Point p1 = new Point();
       Point p2 = new Point(0, 0);
    都会创设一个Point,个中x 和y 被起初化为0。

壹.一 基本类型:其值不得以再解释为任何品种
一.1.壹 整型:整型常量,整型变量。
整型常量:有三种样式:十进制(未有前缀,数码为0~玖),8进制(以0为前缀,数码取值为0
~ 7),十陆进制(以0X或0x为前缀,数码取值为0 ~ 9和A – F(a ~
f))。注:整型常量可增进后缀,首要遵照其体系来增进。

咱俩领会有二个int.马克斯Value和int.MinValue表示int型的最大值和微小值。

壹.② 结构类型
   
二个构造类型是二个数值类型,它能够注脚构造函数、常数、域、方法、属性、索引、操作符和嵌套类型。结构类型在第三1章中讲述。

整型变量:变量是CPU为顺序开发的1块内部存储器地址空间的代号,因而其实质存款和储蓄格局是二进制(即数值是以0一代码试样储存在那块内存空间中的,是以补码方式表示的)。叁个字节Byte

八bit即八个人。补码:正数的补码即为其原码;负数的补码为其原码按位取反,再加1。(所以注意内部存款和储蓄器溢出的场合)

/#include <stdio.h>
void main()
{
int a, b, c;
a = 32767;
b = a + 1;
printf(“%d, %d\n”, a, b)
}
//输出 32767(0111111111111111), -32768(1000000000000000)
//那里内部存储器溢出了,因为再补码中,最右侧第二人表示的是符号位(0表示“+”,
一表 示“-”),当a=32767时即为在14个人下所能表示的最大数值,假使再+
一,则抓住内部存款和储蓄器溢 出,造成0111111111111111 + 一 ==
1000000000000000,即为-3276八(因为在内部存款和储蓄器中数值的代表方法为补码,正数的补码即为自己,所以01111111111111一== 327六七; 而 1000000000000000表示的是负数,其的反码为
111111111111111一 ==
(一)11111111111111一,所现在一八位再+壹,即为一千000000000000 ==
3276八,再算上先是位符号位,即为-3276八)

整型的分类:一)基本型:类型表达符为int,占贰字节;
二)短整型:类型表达符为short int 或 short,占2字节
三)长整型:类型表明符为long int 或 long, 占4字节
亚洲必赢官网,4)无符号整形:类型表达符为unsigned

一.1.二 字符型:字符常量,字符变量,字符串常量。
字符常量定义:用单引号括起来的2个字符(不得以是字符串)。例如:’a’,
‘+’, ‘?’, ‘=’ 都以合法字符常量。
字符常量具有以下特点:一)字符常量只可以用单引号括起来,不可能用双引号或任何括号;二)字符常量只可以是单个字符,不能够是字符串;3)字符能够是字符集中的轻易字符,不过数字被定义为字符常量后就不能够插足数值运算。例,’五’和伍是区别的,’5’是字符常量,不得以涉足数值运算,但是五还是可以。
转义字符:转义字符是壹种新鲜的字符常量。以反斜杠”\”开首,前面跟一个或多少个字符。转义字符具有特别的意思,
分裂于字符原本的意思。例如,”\n”表示回车。(注:那里是运用的双引号,所以它又分别字符串常量。)指标:用来表示一般字符不便于代表的控制代码。

亚洲必赢官网 2

image.png

字符变量定义:字符变量用来存款和储蓄字符常量,即单个字符。字符变量的类型说明符是char,在函数中定义字符变量即:char
a, b;
字符型数据在内部存款和储蓄器中的囤积方式及使用办法:各个字符型变量被分配三个字节的内部存款和储蓄器空间,由此不得不存款和储蓄二个字符型常量,且该字符型常量是以ASCII码的花样存放在该变量的储存空间中的。例,char
a = ’A’;
则a所代替的内部存款和储蓄器空间中储存的是’A’的ASCII码65的贰进制格局0100000一。

/#include <stdio.h>
void main()
{
Char a, b;
a = 65;
b = 66;
printf(“%c, %c\n”, a, b)
printf(“%d, %d\n”, a, b)
}
//输出:A, B
65, 66
//在该例中,a与b是字符型变量,当赋值时予以整型数据a = 65,b =
6陆,因而输出时取决于printf函数中须求输出的格式,如要求输出”%c”即字符型时,即遵照65,
66的ASCII码输出相呼应的字符型常量’A’,
‘B’;如若要求输出”%d”即整型时,即遵照原来的赋值输出陆伍,6陆(注:那里的陆伍,6陆是整型)。

字符串常量定义:是有1对双引号括起来的字符连串(其长度能够为几个字符也得以是2个字符)。
字符常量与字符串常量的分别:一)字符常量用单引号,字符串常量用双引号;二)字符常量只可以是单个字符,字符串常量能够包括三个或三个字符;三)字符常量只占二个字节,而字符串常量占小编字节长度+1,扩大的1个字节是为着存放转义字符”\O”(字符串停止的注脚);四)能够把一个字符常量赋值给字符变量,不过不可能把2个字符串常量赋值给字符变量(因为,字符变量仅有一字节的内部存款和储蓄器空间,而字符串常量往往至少占三个字节,由此会造成内部存款和储蓄器溢出)。

亚洲必赢官网 3

image.png

一.一.3浮点型:浮点型常量,浮点型变量。(注:在浮点数总括中供给留意舍入引用误差,由此在分歧精度数字总计时须求先将低精度转化为高精度(总计机内部推行),再进行总计)。
浮点型常量只行使10进制。有三种样式:拾进制小数方式:由数码0~玖和小数点组成;指数方式:由拾进制数,加阶码标志“E”或“e”及阶码(阶码必须为10进制整数)组成(合法指数情势为三.11E5== 三.1一 * 10^5 ==
31一千)。注:浮点型常量可增加后缀,首要依照其项目来添加。
浮点型变量:

亚洲必赢官网 4

image.png

浮点型变量分类:一)单精度(float)一般编译器中占四个字节(3一位)内部存款和储蓄器空间(注:依照区别编写翻译器,所占内存字节数大概会有变化),数值范围为三.肆E-3捌
~
三.4E3八,只可以提供四个人有效数字;二)双精度(double)占7个字节(60人)内部存储器空间,其数值范围为(一.7E-308
~ 1.七E308)提供1六为有效数字;3)长双精度(long double)

一.2 指针类型:指针是一种奇特的,同时又是颇具主要性成效的数据类型。
其值用来代表有些变量在内部存款和储蓄器储器中的地址。尽管指针变量的取值类似于整型量,不过那多少个体系是一点1滴两样的量。
一.三构造类型:构造类型是根据已经定义的二个或多个数据类型用构造的办法来定义的。正是说,
八个构造类型的值能够表达为多少个“成员” 或
“成分”。而各种“成员”都是三个中坚类型只怕又是三个构造类型。
一.四 空类型:在调用函数值时,
平时应向调用者再次回到三个函数值。那些重返的函数值时有所一定的数据类型的,应在函数定义及函数表明中给予表达。不过也有一类函数,调用后并不要求向调用者再次来到函数值,
那种函数能够定义为“空类型”。其类别表明符为void。
一.5 常量与变量:
常量定义:在程序执行进度中,其值不产生转移的量成为常量。
标志常量:用标识符代表多个常量。在动用前务必先定义:#define 标识符 常量

/#define PRICE 30
void main()
{
int num, total;
num = 10;
total = num * PRICE;
printf(“total = %d”, total);
}

这里的#define
时一条预处理命令,称为宏定义命令,其职能时把该标识符定义为随后的常量值。1经定义,以往在程序中持有出现该标识符的地方均以该常量值代替(#define后边的常量值壹改则全改)。注:习惯上符号常量的标识符用大写字母,变量标识符用小写字母。

变量定义:其值能够变动的量成为变量。

亚洲必赢官网 5

image.png

那里的“k”
即为变量。注:变量定义必须放在变量使用此前,且1般放在函数体的发端部分。

1.6 各个数值型数据里面包车型大巴搅和平运动算:
在不一致数值类型数据开始展览混合运算时,必要先把它们的数值类型转换为同样品种,才能展开下一步运算。有二种转移格局:(壹)自动转换;(2)强制转换
(壹)自动转换:壹)若参加运算的多少的项目分歧,先转移为同样体系,再运算(在自动转换的图景下,如(一)char
a = ‘A’; int b =二; printf(“%c”, a + b); 输出:C。 (二)char a = ‘A’; int
b =贰; printf(“%d”, a + b); 输出:陆7。 (3)float a = 贰.3三; int b =贰;
printf(“%f”, a + b); (a,b转换为double类型再相加)输出:四.3三千0。
(4)float a = 二.3三; int b =贰; printf(“%d”, a +
b);(编写翻译时会warning,输出错误数字,因为在编写翻译时电脑将a,b自动转换为double类型,然后相加,当要求输出int类型时索要强制转换,不然出错。
(5)long a = 二叁; int b =二; printf(“%d”, a +
b);(编写翻译时会warning,输出正确数字2伍,
因为在编写翻译时电脑将a,b自动转换为long int类型,然后相加得到long
int类型的2五,由此输出int类型仍为贰5)
);2)遵照数据长度扩展的样子拓展转移,以确认保障精度不降低。例,int和long数据相加时,先把int数据转换到long再拓展览演出算;三)全部的浮点运算都以以双精度进行的,尽管拥有的因素都以float类型,也都要先转换到double再开始展览演算(保障数值的最低舍入抽样误差)。4)char和short参加运算时务必先转移为int(注:char型根据其ASCII码进行更换,若是char
a =
‘伍’,要以伍进展览演出算的话需能够开始展览机动转换(因为字符’伍’对应的ASCII码表中的数值也是五)也能够拓展强制转换(直接a
=int(a),得出数字伍));伍)在赋值运算中,赋值号两边的数据类型差别时,赋值号左边的值的类型转换为赋值号左侧的变量的连串。当赋值号右侧的数据类型的长短长于左侧时,将会依照4舍5入的办法来下滑局地精度(即丢失部分数据)。(例:char
a = 6伍;
那里的a是char型,而陆⑤是int型,由此要将陆伍更换为其所对应的ASCII码0一千001,再转换到对应的字符型’A’然后赋给a)。

亚洲必赢官网 6

image.png

//例
/#include <stdio.h>
void main()
{
float PI = 3.14159;
int s, r = 5;
s = r * r * PI;
Printf(“s = %d\n”, s)
}
\输出:s = 79
\测算时,首先PI和r都转换为double,然后相乘,获得的double型数值肆舍伍入成int型赋给s。

(二)强制转换:转换情势:(类型表达符)(表明式)。
其功能是把表明式的运算结果强制转换到类型表达符所表示的花色。
例,(float) a 将a强制转换来float类型
(int) (x + y) 将x,
y强制转换来int(注,这里的x和y都要用括号括起来,因为x,y都要强制转换)
运用强制转换的注意事项:
一)类型表达符和表明式都得加括号(表明式为单个变量能够不加),例如把(int)
(x+y)写成(int) (x) + y则变成先把x强制转换到int再与y相加。
二)无论是强制转换依旧机关转换,都以一时性的,都不会变动多少注解时对该变量定义的系列(例,int
a = 三, b =五; float c; c = (float) (a + b); 可是a和b还是是int类型)。

1.7 算术运算符和算术表明式
算数运算符:算数运算符分1)单目运算符;二)双目运算符;三)3目运算符
运算符优先级:

亚洲必赢官网 7

image.png

运算符结合性:一)左结合性(自左向右)(如”-”,”+”);二)右结合性(自右向左)(如赋值运算符”=”,
x = y = z,即x = (y = z))。

亚洲必赢官网 8

image.png

赋值运算的类型转换注意事项:当赋值运算符左右两边类型不一致时,系统活动实行类型转换,将右侧的类型转换为左侧的系列:一)浮点型赋予整型,舍去小数部分;
二)整型赋予浮点型,数值不变,但以浮点型式存放(小数部分的值为0);3)字符型赋予整型,因为字符型为3个字节,而整型为1个字节,由此将字符的ASCII码值放在整型变量的低八位,高四个人全为0。整型赋给字符型,只把低陆个人赋给字符变量(因而2个字符变量存放的int值范围为-128~25陆,那里须求留意的是最左侧第二位为标志位,当输入负值时,其余位求反再加一得补码(其实通超过实际际测试,当输入为正数时,可是输入值超越1二柒时,printf(“%d”,
a)输出的是3个负值,因为1贰7 == 0111111一,而128 ==
一千00000(编写翻译器自动认为是负数),即(1)0000000求反(一)111111壹,再+一得(一)一千0000
== – 12捌))。
再赋值运算符”=”在此之前拉长别的二目运算符能够结合复合运算符,如 +=, -=, *=,
/=, %=, <<=, >>=, &=, ^=, !=等。

逗号运算符 “,”, 功能是把四个表明式连接起来组成3个表明式。
诚如方式是:表明式壹, 表达式二;
其求值进度是,分别求出3个表明式的值,然后以发挥式二的值作为全数逗号表明式的值(扩充到揭橥式n,则发表式n的值即为整个逗号表明式的值)。

//例
/#include <stdio.h>
void main()
{
int a = 2, b = 3, c = 4, x, y;
y = (x = a + b), b + c;
printf(“y = %d, x = %d”, y, x);
}
//输出:y = 7, x = 5

当大家直接定义:int a = int.MaxValue + 一的时候,编写翻译器会提醒出错:

1.三 容易类型
   
C#提供了1多元的预订义结构类型,称为简单类型。这么些简单类型通过重大词显著,不过那么些关键词能够为在System
名称空间中的预约义结构类型首要词起简单的别称,就如上边表中所示。
   关键字                有别称的档次
   sbyte              System.SByte
   byte               System.Byte
   short              System.Int16
   ushort             System.Uint16
   int                System.Int32
   uint               System.Uint32
   long               System.Int64
   ulong              System.Uint64
   char               System.Char
   float              System.Single
   double             System.Double
   bool               System.Boolean
   decimal            System.Decimal
   
2个粗略类型和它有外号的协会类型是不可分辨的。换句话说,当写下保留字byte
时和写System.Byte确实尚未什么样界别,并且用System.Int3二 也与用保留字int
相同。
   
因为八个差不离类型代表了三个组织类型,所以每种简单类型都有成员。例如,int
有在System.Int3二 中宣称的积极分子和从System.Object
中一连的成员,并且下面包车型地铁讲话是同意的:
      int i = int.MaxValue;           // System.Int32.MaxValue
constant
      string s = i.ToString();        // System.Int32.ToString()
instance method
      string t = 123.ToString();      // System.Int32.ToString()
instance method
    注意,整数文字上是int 类型数据,并且还要也是System.Int32结构类型的数目。
简单类型与别的协会类型,别的组织类型允许包蕴附加操作符:
  超越二分之一粗略类型允许通过运用文字来创造(§错误!未找到引用源。)。例如,123 是int
类型量,而’a’是字符类型量。C#使得不用对别的协会类型文字实行预订义,而别的协会类型数据差不离是由此这几个组织类型的构造函数来创建。
 
当二个表达式的运算符都以粗略类型常数时,编写翻译器在编写翻译时就足以对那么些表明式举办赋值。这样3个表明式称为常数表明式(§错误!未找到引用源。)。包含其它协会类型定义的操作符的表明式常常意味着运维时赋值。
  通过const
注解,就有非常的大恐怕声惠氏个大致类型(§拾.三)的常数。不容许有其它组织类型的常数,可是static
readonly 域提供了貌似的作用。
 
包括简单类型的转移可以参与由其余协会类型定义的更换操作符的赋值,可是用户定义的变换操作符不能够参加其余二个用户定义操作符的赋值。

 亚洲必赢官网 9

一.肆 整数类型
   
C#支撑9种平头体系:sbyte、byte、short、ushort、int、uint、long、ulong和char。那些整数类型有下边的深浅和数值范围:
  sbyte类型表示有号子的六人整数,数值范围为-12八到12柒。
  byte类型表示无符号八 位整数,数值范围为0 到25伍。
  short类型表示有号子十7人整数,数值范围为-32768 到32767。
  ushort类型表示无符号15个人整数,数值范围为0 到65535。
  int类型表示有号子3二 位整数,数值范围为–214748364八 到21474836肆柒。
  uint类型表示无符号3二 位整数,数值范围为0 到429496729伍。
  long类型表示有标志6四 位整数,数值范围为–9223372036854775808到922337203685477580七。
  ulong类型表示无符号64 位整数,数值范围为0 到18446744073709551615。
  char类型表示无符号十七人整数,数值范围为0
到6553伍。char类型的大概数值集符合Unicode字符集。
平头类型1元和2元操作符总是按有标志3二 位精度、无符号3贰 位精度、有记号6十一位精度或无符号611位精度实行操作。
  对于一元+和~操作符,操作数被更换为类型T,这里T 是int、uint、long
和ulong 中首先个能够完全代表操作数的持有希望值的体系。操作使用项目T
的精度来完毕,而结果的精度也是T。
  对于一元操作符-,操作数被撤换为类型T,那里T 是int 和long
中首先个能够完全意味着操作数的享有相当大希望值的连串。操作使用项目T
的精度来促成,而结果的精度也是T。一元操作符-不能够动用于ulong
类型操作数。
 
对于2元操作符+、–、*、/、%、&、^、|、==、!=、>、<、>=和<=操作符,操作数被转移为类型T,那里T
是int、uint、long 和ulong
中第多少个能够完全意味着操作数的具备大概值的品种。操作使用项目T
的精度来落到实处,而结果的精度也是T (或相关操作符bool )。
  对于2元操作符<<和>>操作符,操作数被转移为类型T,这里T
是int、uint、long 和ulong
中率先个可以完全代表操作数的富有望值的档次。操作使用项目T
的精度来促成,而结果的精度也是T

 

char 类型被分门别类为一种整数类型,然则它在两点上差异于此外整数类型:
 
未有从任何门类到字符类型的蕴藏的转移。甚至,即便sbyte、byte和ushort类型的多少完全能够用char类型代表,但是从sbyte、byte和ushort类型到char
的涵盖转换也不存在。
*  char
类型的常数必须写成字符文字。字符常量可以只是写成与二个斜杠结合的平头文字。例如,(char)十与’\x000A’相同。
   
checked和unchecked操作符和话语用来控检整数类型算术操作和转移(§7.伍.一三)的溢出。在壹段checked上下文中,三个溢出发生一个编译时不当也许滋生扔出一个OverflowException。在一段unchecked
的内外文里,溢出被忽略并且不需要送到目的项指标其余高端位被丢掉。

在注脚x变量时先后编写翻译会报错。

一.五 浮点类型
C#协助四个浮点类型:float和double。float和double类型用叁拾位单精度和60位双精度IEEE754格式来表示,它提供了一名目繁多数值:
 
正零和负零。在多数动静下,正零和负零与简短的零值相同,可是它们的行使个中有一对分别。
 
正无穷大和负无穷大。无穷大是由1个非零成员除以零的操作爆发的。例如,一.0/0.0生出正无穷大,而–一.0/0.0生出负无穷大。
  非数字数据,平日缩写为NaN 。NaN
是低效的浮点数操作发生的,例如零除以零。
  形如s × m × 二e  的非零数据有限集,那里s 是1 要么-一,而m 和e
由具体浮点数类型决定:对于float,0 < m < 2二肆  和-149 ≤e ≤
10四,对于double,0 < m < 二5三  和-十75 ≤e ≤ 970。
float 类型能够代表的数值范围差不离从壹.五 × 十-45  到三.四 × 103捌 ,有伍位数字位精度。
double类型能够代表的数值范围大致从5.0 × 10-3贰四  到一.七 × 十30⑧ ,有15到十几个人数字位精度。
要是贰元运算符的二个操作数是浮点类型,那么任何操作数必须是整数类型恐怕是浮点数类型,并且操作按上边求值:
 
假若二个操作数是整数类型,那么这贰个操作数会被转换为与别的操作数一样的浮点数类型。
  假诺操作数是double
类型,其它操作数就要更换为double,操作就要依据double
类型的范围和精度来展开,而且计算的结果也是double
类型(对于相关操作,只怕是bool)。
  不然,操作至少使用float 的范围和精度,而且总计的结果也是float 类型
(对于相关操作,也许是(bool )。
   
   
包蕴赋值操作符的浮点操作符,从不爆发格外。在非凡景况下,浮点数操作会发生下边介绍的零、无穷大或NaN
作为代表:
 
假如浮点数操作的结果对于目的情势来说太小,操作的结果就会更换为正零或负零。
 
假设浮点数操作的结果对于目的情势来说太大,操作的结果就会变换为正无穷大或负无穷大。
  要是浮点数的操作是无济于事的,操作的结果就会变换为NaN 。
  假若一个或持有浮点操作的操作数都以NaN,那么操作的结果就变成NaN 。
   
浮点数操作可以用比操作结果的种类更高的精度来进行。例如,一些硬件结构协理贰个比double
类型更大范围和更高精度的“扩大的”或“long
double”浮点数类型,并且会隐含地使用这几个更高的精度来促成浮点数操作。唯有在性质要优良付出时,那样的硬件结构才会被用来完结精度小部分的浮点数操作,而不供给履行同时丧失品质和精度,C#同意持有的浮点数操作使用更高的精度类型。与付出更高精度的结果差异,那样差不多从未任何可衡量的震慑。在形如x
*y/ z 的表明式中,这里的乘法发生多个胜出double
类型范围的结果,但是前面包车型客车除法带来三个重临double
范围的权且结果,实际上在大片段的限定格局计算那么些表达式会发出有限的结果而不是无穷无尽大。

但上面注明的变量a,b进行相加时能够一定的是出现了算术溢出荒唐,但却还是得以获取不错的结果。

一.陆 十进制类型
   
10进制类型是二个1二19人数据类型,适合经济和货币总结。十进制类型能够表示的数值范围是从     
-28          2八
一.0 × 拾 到大体七.玖 × 10 ,有28 到2玖 个有效数字位。 e ,那里s 是1依旧-一,0 ≤m < 2九陆 而-28 ≤e ≤ 0 。
十进制
拾进制类型数值的蝇头集合情势为s × m × 十
品类不援助有号子零、无穷大和NaN 。
    一个10进制数由96 位整数和十人幂表示。对于三个万万数值低于一.0m
的10进制数,数据正是第贰8个10进制位,然而尚未越多。对于相对值大于或等于一.0m
的拾进制数,数据恐怕是28 或2玖 数字位。与float 和double 类型相比,如0.一的十进制小数成员能够就用拾进制表示。在用float 和double
表示时,那样的成员日常为Infiniti小数,使得那些代表有更大的舍入固有误差。
    
假诺一个二元操作符的操作数是10进制类型,别的操作数也必须是整数类型或10进制类型。假如要选用一个平头类别操作数,在操作被执行前它会被更换为十进制数。
    10进制类型的数值的操作正是28 或2九 数字位,但是不会多于2810进制位。结果为最相仿的可代表的数值,当结果与五个可代表数值都距离都十分时,选用在相当小数据位上为奇数的数值。
   
尽管十进制算术操作发生了一个在舍入后对于10进制格局太小的数据,操作的结果就变为零。倘使叁个10进制算术操作发生了叁个对此10进制情势太大的数目,就会抛出2个OverflowException错误。
   
十进制类型比浮点类型有更高的精度不过有更小的界定。那样,从浮点数类型转换成十进制类型可能会发生溢出的要命,并且从10进制类型转换成浮点数类型或许会有精度损失。出于这么些原因,不存在浮点数类型和十进制类型间的隐式转换,并且也未曾显式的图景,在同一个表明式中把浮点数和10进制操作数混合在1块儿是不或然的。

 亚洲必赢官网 10

1.7 布尔类型
    bool类型表示布尔逻辑量,bool类型的只怕值为true和false。
    在bool 和任何项目间不设有标准的转移。尤其是,bool
类型与整数类型截然不相同,bool
数据不可能用于选用整数项目标地点,反之亦然。
    在C
和C++语言中,零整数值或空指针能够被撤换为布尔数值false,而非零整数数值或非空指针能够变换为布尔数值true
。但在C#中,那样的转换由显式地把整数数值和零相比较或显式地把目的和null
相比来落实。

 

4.1.8 枚举类型
枚举类型是一种著名称常数的新鲜类型。各类枚举类型都有前级类型,能够是byte、short、int或long。枚举类型通过枚举申明来定义。

在举办完a = a+b后发现a的值变成了-三

-------思多雅[天行健]版权全体,首发印度洋论论坛,转发请申明-------

 亚洲必赢官网 11

总结,大家要多留神一下C#与C++及C语言中指针及项指标对待。有时十分大心,就会挑起出错,在检讨时,留意查看那方面便是了。

 

而前面两步总括均能得出正确的结果….

 亚洲必赢官网 12

 

表明:参考msdn操作符表达:

 

操作符重载和隐式转换:

 

 

算术溢出

算术运算符(+、-、*、/)的猜测结果可能会超出所涉数值类型的可取值范围。
详细音讯应参考特定运算符的连锁章节,而①般意况下:

  • 平头算术溢出可能吸引
    OverflowException,也许扬弃结果的最高有效位。
    整数被零除总是吸引 @System.DivideByZeroException。

发出整数溢出时,具体影响视执行上下文而定,上下文可为 checked 或
unchecked。
在 checked 上下文中引发
OverflowException。
在 unchecked 上下文中,抛弃结果的最高有效位并继续执行。 由此,C#
让您有空子选取处理或不经意溢出。 私下认可情状下,算术运算产生在 unchecked
上下文中。

除算术运算以外,整型类型之间的显式转换也会招致溢出(例如,将
long
显式转换到
int),并遭到
checked 或 unchecked 执行的羁绊。
可是,位运算符和移动运算符永远不会造成溢出。

  • 浮点算术溢出或被零除从不引发那个,因为浮点类型基于 IEEE
    75四,因而能够代表无穷大和 NaN(非数值)。
  • 小数算术溢出总是吸引
    OverflowException。
    小数被零除总是迷惑
    DivideByZeroException。

 

 

小结:大部分意况下数值总结很少有时机会合溢出,但具体特殊景况应切切实实相比较。

如:

壹,  变量开始化时给定为int.马克斯Value,在行使时必定要考虑总结溢出。

二,  在大量的轮回或递归中总计时有望会招致算术溢出。

3, 
从IO输入设备中取值,特别是用户输入的值中很有相当大可能率是贰个溢出的失效输入。

四,  注意.NET
CL昂科拉暗中同意情状下算术运营是产生在unchecked上下文。借使爆发算术溢出,程序不会出错,可能赢得正确或错误的结果。

 

 

 

网站地图xml地图