c#学习笔记4

  
2007-9-6
简单对象访问协议Simple Object Access Protocol, SOAP),是一种轻量的、简单的、基于 XML的协议,它被设计成在 WEB上交换结构化的和固化的信息。 SOAP 可以和现存的许多因特网协议和格式结合使用,包括 超文本传输协议(HTTP), 简单邮件传输协议(SMTP), 多用途网际邮件扩充协议(MIME)。它还支持从消息系统到 远程过程调用(RPC)等大量的应用程序。SOAP使用基于XML的数据结构和超文本传输协议(HTTP)的组合定义了一个标准的方法来使用Internet.上各种不同操作环境中的分布式对象。
.net包括四个组成部分:VOS类型系统、元数据、公用语言规范、虚拟执行系统。
元数据是对VOS中类型描述代码的一种称呼。
CLR( 公共语言运行库 ) Java 虚拟机一样也是一个运行时环境,它负责资源管理(内存分配和垃圾收集),并保证应用和底层操作系统之间必要的分离。
JIT 编译器 Just-In-Time 。它允许实时地将 Java 解释型程序自动编译成本机机器语言,以使程序执行的速度更快。
运行时环境自动处理对象的展开与引用,当他们不再使用时负责它们的释放。
CLR 使以不同语言设计的对象能够彼此间进行通信,并且他们的行为能够紧密地综合与协调。
这种跨语言的继承之所以可能,因为以运行时间为目标的语言编译器与工具使用一种运行时间所定义的公用类型系统,他们遵守运行时的规则阿里定义新的类型,生成、使用、保持并绑定类型。
CLR 引入了“代”的概念。代,指堆中对象产生的先后。
.NET平台通过使用集合来解决“DLL地狱”问题。“集合是一个专有名词,指类型与资源的发布单元,在很大程度上等同于今天的DLL。它用元数据描述包含类型的集合。通常来说,集合有四个部分组成:集合的元数据、元数据描述的类型、实现类型的中间语言代码和一组资源。在一个集合中,以上四个部分并不是都必须存在,但是,集合中必须包含类型或资源,这样集合才有意义。
CLS范围的规定:CLS的规则仅作用于在定义他们的语言集合之外仍然可见的项上。对C#程序进行注释是要注意两个问题:
1、避免在“//”之后的单行注释中是用反斜杠符号“/”。因为反斜杠符号“/”在C#中是一个续行符。
2、分隔符“/*”和“/*”之间的注释不能有嵌套注释。
 
第四章 数据类型
C#的数据类型可以分为两大类:值类型和引用类型。值类型包括:简单类型、结构类型和枚举类型。
回复:一个关于float 精度的疑问

【转】

最近一段时间看到版上关于C++里浮点变量精度的讨论比较多,那么我就给对这个问题有疑惑的人详细的讲解一下intel的处理器上是如何处理浮点数的。为了能更方便的讲解,我在这里只以float型为例,从存储结构和算法上来讲,double和float是一样的,不一样的地方仅仅是float是32位的,double是64位的,所以double能存储更高的精度。还要说的一点是文章和程序一样,兼容性是有一定范围的,所以你想要完全读懂本文,你最好对二进制、十进制、十六进制的转换有比较深入的了解,了解数据在内存中的存储结构,并且会使用VC.net编译简单的控制台程序。OK,下面我们开始。

大家都知道任何数据在内存中都是以二进制(1或着0)顺序存储的,每一个1或着0被称为1位,而在x86CPU上一个字节是8位。比如一个16位(2字节)的short int型变量的值是1156,那么它的二进制表达就是:00000100 10000100。由于Intel CPU的架构是Little Endian(请参数机算机原理相关知识),所以它是按字节倒序存储的,那么就因该是这样:10000100 00000100,这就是定点数1156在内存中的结构。

那么浮点数是如何存储的呢?目前已知的所有的C/C++编译器都是按照IEEE(国际电子电器工程师协会)制定的IEEE 浮点数表示法来进行运算的。这种结构是一种科学表示法,用符号(正或负)、指数和尾数来表示,底数被确定为2,也就是说是把一个浮点数表示为尾数乘以2的指数次方再加上符号。下面来看一下具体的float的规格:

float
共计32位,折合4字节
由最高到最低位分别是第31、30、29、……、0位
31位是符号位,1表示该数为负,0反之。
30-23位,一共8位是指数位。
22-0位,一共23位是尾数位。
每8位分为一组,分成4组,分别是A组、B组、C组、D组。
每一组是一个字节,在内存中逆序存储,即:DCBA

我们先不考虑逆序存储的问题,因为那样会把读者彻底搞晕,所以我先按照顺序的来讲,最后再把他们翻过来就行了。

现在让我们按照IEEE浮点数表示法,一步步的将float型浮点数12345.0f转换为十六进制代码。在处理这种不带小数的浮点数时,直接将整数部转化为二进制表示:1 11100010 01000000也可以这样表示:11110001001000000.0然后将小数点向左移,一直移到离最高位只有1位,就是最高位的1:1.11100010010000000一共移动了16位,在布耳运算中小数点每向左移一位就等于在以2为底的科学计算法表示中指数+1,所以原数就等于这样:1.11100010010000000 * ( 2 ^ 16 )好了,现在我们要的尾数和指数都出来了。显而易见,最高位永远是1,因为你不可能把买了16个鸡蛋说成是买了0016个鸡蛋吧?(呵呵,可别拿你买的臭鸡蛋甩我~),所以这个1我们还有必要保留他吗?(众:没有!)好的,我们删掉他。这样尾数的二进制就变成了:11100010010000000最后在尾数的后面补0,一直到补够23位:11100010010000000000000(MD,这些个0差点没把我数的背过气去~)

再回来看指数,一共8位,可以表示范围是0 - 255的无符号整数,也可以表示-128 - 127的有符号整数。但因为指数是可以为负的,所以为了统一把十进制的整数化为二进制时,都先加上127,在这里,我们的16加上127后就变成了143,二进制表示为:10001111
12345.0f这个数是正的,所以符号位是0,那么我们按照前面讲的格式把它拼起来:
0 10001111 11100010010000000000000
01000111 11110001 00100000 00000000
再转化为16进制为:47 F1 20 00,最后把它翻过来,就成了:00 20 F1 47。
现在你自己把54321.0f转为二进制表示,自己动手练一下!

有了上面的基础后,下面我再举一个带小数的例子来看一下为什么会出现精度问题。
按照IEEE浮点数表示法,将float型浮点数123.456f转换为十六进制代码。对于这种带小数的就需要把整数部和小数部分开处理。整数部直接化二进制:100100011。小数部的处理比较麻烦一些,也不太好讲,可能反着讲效果好一点,比如有一个十进制纯小数0.57826,那么5是十分位,位阶是1/10;7是百分位,位阶是1/100;8是千分位,位阶是1/1000……,这些位阶分母的关系是10^1、10^2、10^3……,现假设每一位的序列是{S1、S2、S3、……、Sn},在这里就是5、7、8、2、6,而这个纯小数就可以这样表示:n = S1 * ( 1 / ( 10 ^ 1 ) ) + S2 * ( 1 / ( 10 ^ 2 ) ) + S3 * ( 1 / ( 10 ^ 3 ) ) + …… + Sn * ( 1 / ( 10 ^ n ) )。把这个公式推广到b进制纯小数中就是这样:
n = S1 * ( 1 / ( b ^ 1 ) ) + S2 * ( 1 / ( b ^ 2 ) ) + S3 * ( 1 / ( b ^ 3 ) ) + …… + Sn * ( 1 / ( b ^ n ) )
目前大多数高级语言(包括C)都按照IEEE-754标准来规定浮点数的存储格式,IEEE754规定,单精度浮点数用4字节存储,双精度浮点数用8字节存储,分为三个部分:符号位、阶和尾数。阶即指数,尾数即有效小数位数。单精度格式阶占8位,尾数占24位,符号位1位,双精度则为11为阶,53位尾数和1位符号位,如下图所示:
  单精度浮点数存储格式
  s
  指数
  尾数
   31 30 23 22 0
  双精度浮点数存储格式 s
  指数
  尾数
   63 62 52 51 0
  细心的人会发现,单双精度各部分所占字节数量比实际存储格式都了一位,的确是这样,事实是,尾数部分包括了一位隐藏位,允许只存储23位就可以表示24位尾数,默认的1位是规格化浮点数的第一位,当规格化一个浮点数时,总是调整它使其值大于等于1而小于2,亦即个位总是为1。例如1100B,对其规格化的结果为1.1乘以2的三次方,但个位1并不存储在23位尾数部分内,这个1是默认位。
  阶以移码的形式存储。对于单精度浮点数,偏移量为127(7FH),而双精度的偏移量为1023(3FFH)。存储浮点数的阶码之前,偏移量要先加到阶码上。前面例子中,阶为2的三次方,在单精度浮点数中,移码后的结果为127+3即130(82H),双精度为1026(402H)。
   浮点数有两个例外。数0.0存储为全零。无限大数的阶码存储为全1,尾数部分全零。符号位指示正无穷或者负无穷。
  下面举几个例子:
  单精度浮点数 十进制
  规格化
  符号
  移阶码
  尾数
  -12
  -1.1x23
  1
  10000010
  1000000 00000000 00000000
  0.25
  1.0x2-2
  0
  01111101
  0000000 00000000 00000000
  所有字节在内存中的排列顺序,intel的cpu按little endian顺序,motorola的cpu按big endian顺序排列
 
 
C#定义了一种十进制类型,主要用于方便在金融和货币方面的计算。十进制类型是一种高精度、128位数据类型,它表示的范围从大约1.0*10 -28到7.9  *10 28的28至29位有效数字。注意,该精度是用位数而不是以小数位来表示的。运算结果准确到28个小数位。
当定义一个decimal变量并赋值给它时,使用m下表已表明它是一个十进制类型,如:
decimal d_value=1.0m;
如果省略了m,在变量被赋值之前,它将被编译器当作双精度类型来处理。
 
 
直接通过十六进制转义符(前缀/x)或Unicode表示发给字符型变量赋值(前缀/u),如Char c=’/x0032’;char c=’/u0032’;c#中禁止对字符型变量使用整数进行赋值和运算。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值