字节序(byte order)和位序(bit order)

字节序(byte order)和位序(bit order)
字节序(byte order)和位序(bit order)

字节序(byte order)和位序(bit order)

字节序(byte order)和位序(bit order)

在网络编程中经常会提到网络字节序和主机序,也就是说当一个对象由多个字节组成的时候需要注意对象的多个字节

在内存中的顺序。

以前我也基本只了解过字节序,但是有一天当我看到ip.h中对IP头部结构体struct iphdr的定义时,我发现其中竟然对一个字节中的8个比特位也区分了大小端,这时我就迷糊了,不是说大小端只有在多个字节之间才会有区分的吗,为什么这里的定义却对一个字节中的比特位也区分大小端呢?

下面我们先看一下struct iphdr的定义,后文会解惑为什么要在一个字节中区分大小端。

struct iphdr {

#if defined(__LITTLE_ENDIAN_BITFIELD)

__u8 ihl:4,

version:4;

#elif defined (__BIG_ENDIAN_BITFIELD)

__u8 version:4,

ihl:4;

#else

#error "Please fix "

#endif

__u8 tos;

__be16 tot_len;

__be16 id;

__be16 frag_off;

__u8 ttl;

__u8 protocol;

__sum16 check;

__be32 saddr;

__be32 daddr;

/*The options start here. */

};

字节序(Byte order)

关于字节序的文章已经有很多了,在我这篇文章中不打算过多的说字节序,但是也不能完全脱离字节序因为后面的重点部分比特序跟字节序也有一定的相似度和联系。

字节序就是说一个对象的多个字节在内存中如何排序存放,

比如我们要想往一个地址a中写入一个整形数据

0x12345678,那么最后在内存中是如何存放这四个字节的呢?

0x12这个字节值为最高有效字节,也就是整数值的最高位(在本文中0x12=0x12000000),0x78为最低有效字节。

图1:大端字节序

上图是大端字节序的示意图,所谓”大端字节序”,便是指最高有效字节落在低地址上的字节存放方式。

图2:小端字节序

而小端字节序就是最低有效字节落在低地址上的字节存放方式。

0x12345678=0x12000000 + 0x340000 + 0x5600 + 0x78,所以

要想保持一个对象的值在大小端系统之间不变,那么就必须确保不同的系统能够正确的识别最高有效字节和最低有效

字节(不能错误的识别最高、最低有效字节)。

同样的字节序12 34 56 78在大端序机器中会识别为

0x12345678(0x12000000 + 0x340000 + 0x5600 +

0x78=0x12345678),在小端序机器中识别为0x78563412(0x12 + 0x3400 + 0x5600 00+ 0x78000000=0x78563412)。

所以要想两者保持一致就必须确保系统能够正确的识别最

高有效字节0x12和最低有效字节0x78,那么在小端系统中字节存放的顺序应该为78 56 34 12。

比特序(bit order)

字节序是一个对象中的多个字节之间的顺序问题,比特序就是一个字节中的8个比特位(bit)之间的顺序问题。一般情况下系统的比特序和字节序是保持一致的。

一个字节由8个bit组成,这8个bit也存在如何排序的情况,跟字节序类似的有最高有效比特位、最低有效比特位。

比特序1 0 0 1 0 0 1 0在大端系统中最高有效比特位为1、最

低有效比特位为0,字节的值为0x92。在小端系统中最高、最低有效比特位则相反为0、1,字节的值为0x49。

跟字节序类似,要想保持一个字节值不变那么就要使系统能正确的识别最高、最低有效比特位。

字节序转换函数ntohl(s)、htonl(s)

在socket编程中经常要用到网络字节序转换函数ntohl、htonl 来进行主机序和网络序(大端序)的转换,在主机序为小端的系统中字节序列78 56 34 12(val=0x12345678)经过htonl转换后字节序列变成12 34 56 78:

图3:htonl函数

字节序转换后我在想是不是比特序也一同进行了转换?

为什么会有这个疑问呢,因为前文可知系统的比特序和字节序是一致的,现在字节序已经从小端变成了大端那么比特序应该也要一起转换。而且如果比特序不变化那么当这些字节到了目标大端序系统中后每一个字节的值都会发生变化,因

为同样的比特序列在小端和大端系统中识别的字节值会不一样。

首先从htonl、ntohl的源码来看确实只进行了字节序的转换并没有进行比特序的转换,再有就是以前socket编程的时候只调用了ntohl、htonl等函数并没有调用(而且系统也没有提供)比特序转换函数,但是最后的结果都是正确的,并没有发现上面提到的字节值发生变化的问题。

那么这个”神奇”的事情是怎么解决的呢,好像系统本身就给我们”悄悄”的解决了我担心的问题。

答案我们下文揭晓。

比特(bit)的发送和接收顺序

比特的发送、接收顺序是指一个字节中的bit在网络电缆中是如何发送、接收的。在以太网(Ethernet)中,是从最低有效比特位到最高有效比特位的发送顺序,也就是最低有效比特位首先发送,参考资料:frame。

在以太网中这个规定有点奇怪,因为字节序我们是按照大端序来发送,但是比特序却是按照小端序的方式来发送,下图

是直接从网上找来的一张图,主机序本身是大端序:

图4:比特发送、接受示意图

比特的发送、接收顺序对CPU、软件都是不可见的,因为我们的网卡会给我们处理这种转换,在发送的时候按照小端序发送比特位,在接收的时候会把接收到的比特序转换成主机的比特序,下面是一个小端机器发送一个int整型给一个大端机器的示意图:

图5:小端->大端比特发送示例

因为对网卡对比特序的发送、接收所做的转换没有深入的了解所以上图很有可能会有错误之处。

现在来回答一下第3节中的那个疑问:

htonl、ntohl函数肯定是不会同步转换一个字节中的比特序

的,因为如果比特序也发生了转换的话那么这个字节的值也就发生了变化,记住htonl、ntohl只是字节序转换函数。

比特序按照小端的方式发送,首先发送的是最低有效比特位,最后发送的是最高有效比特位,接收端的网卡在接收到比特序列后按照主机的比特序把接收到的”小端序”比特流转换成主机对应的比特序列。

可以假设存在ntohb、htonb(b代表bit)这样的两个函数,网卡进行了比特序的转换,不过是这两个函数是网卡自动调用的,我们平时不用关注。

按照规则,发送、接收的时候进行比特序的转换,那么就能保证在不同的机器之间进行通信不会发生我担心的字节值

发生变化的问题。

结构体的位域

关于C语言中结构体的位域可以参考这篇文章:

https://www.360docs.net/doc/5410075688.html,/2013/05/21/talk-about-bitfield-in-c-again/,对于位域的具体用法、语法参考这篇文章即可有。

对于位域有一个约定:在C语言的结构体中如果包含了位域,如果位域A定义在位域B之前,那么位域A总是出现在低序的比特位。

在计算机中可寻址的最小单位为字节,bit是无法寻址的,但是为了抽象我们可以把计算机的最小寻址单位变成bit,也就是我们可以单独获得一个bit位。

我们有如下的一段代码:

#include

struct bit_order{

unsigned char a: 2,

b: 3,

c: 3;

};

int main(int argc, char *argv[])

{

unsigned char ch = 0x79;

struct bit_order *ptr = (struct bit_order *)&ch;

printf("bit_order->a : %u\n", ptr->a);

printf("bit_order->b : %u\n", ptr->b);

printf("bit_order->c : %u\n", ptr->c);

return 0;

}

我们把代码在gentoo(intel小端机器)、hu-unix(大端机器)两个机器上面编译、运行,结果如下:

liuxingen@ V6-Dev ~/station $ ./bitfiled

bit_order->a : 1

bit_order->b : 6

bit_order->c : 3

下面是hp-unix的运行结果

# ./bitfiled

bit_order->a : 1

bit_order->b : 7

bit_order->c : 1

我们先分析一下gentoo上面的结果:

图6:小端机器的位域示例

从上图中我们很容易就能理解gentoo上面的输出结果,下面是hp-unix上面示意图:

图7:大端机器的位域示例

从上面的输出可以看到同样的代码在不同的机器中输出了不同的结果,也就是说我们的代码在不同的平台不能直接移植,导致这个问题的原因就是我们前面提到的关于位域的一个约定,定义在前面的位域总是出现在低地址的bit位中,因为不同的平台的比特序是不同的,但是我们定义的位域没有根据平台的大小端进行转换,最后就导致了问题。那么如

何解决这个问题,那就是在定义结构体中的位域时判断平台的大小端:

#include

#include

struct bit_order{

#if defined(__LITTLE_ENDIAN_BITFIELD)

unsigned char a: 2,

b: 3,

c: 3;

#elif defined (__BIG_ENDIAN_BITFIELD)

unsigned char c: 3,

b: 3,

a: 2;

#else

#error "Please fix "

#endif

};

int main(int argc, char *argv[])

{

unsigned char ch = 0x79;

struct bit_order *ptr = (struct bit_order *)&ch;

printf("bit_order->a : %u\n", ptr->a);

printf("bit_order->b : %u\n", ptr->b);

printf("bit_order->c : %u\n", ptr->c);

return 0;

}

到此我们也就解释了文章开头关于struct iphdr定义中的那个疑问。

最后给大家隆重介绍一篇文章,对我启发很大,文中的很多知识来自于它:byte order and bit order

合同法的公序良俗原则论述

合同法的公序良俗原则论述 公序良俗原则是我国民法领域一项重要基本原则,由于缺乏具体的法律条文来明确该原则的适用标准,因此在司法实践中出现了同案不同判的尴尬局面。下面是小编搜集整理的相关内容的论文,欢迎大家阅读参考。 摘要:新事物总是在人类社会的不断进步中产生的,其中有生命力的新事物又在推动着社会的不断发展。人类在这样一个总体前进的过程中,享受到了众多科技成果的同时,却也在社会道德方面出现了很多问题。这些问题的存在,对于社会整体道德水平的提升是非常不利的。然而,面对这些问题,我国现行的法律当中却没有与之相对应的具体规定和依据,这大大加剧了社会道德败坏行为。要解决这一问题,就需要采取多方面的措施。公序良俗原则在法律包括合同法条文中的出现,无疑成为解决目前社会道德问题的福音。 一、公序良俗原则的基础理论 (一)公序良俗原则的发展 公序良俗最早是以观念的形式产生的,其中对于公序这一原则最早的规定是对公民享受到的权利和利益,而良俗则是公民应当具备的一般道德准则。但是这两项含义并非一成不变的,其随着时间和空间的变化而变化。这一原则的存在,毫无疑问地起到了弥补法律漏洞的作用。但是,由于其本身没有被赋予法律地位,因为也没有得到普通大众的足够重视,因而没有发挥出更大的社会作用。为了强化这一原则的重要性,之后的西方资本主义国家,都开始将这一原则引入到法

律条文当中。我国也开始在清末时期,在民法典中对公序原则有了一定的提及,但是对善良风俗的内容却没有做出必要的规定。一直到新中国成立,我国法律中对社会利益与社会公德进行了必要的规定,标志着公序良俗这一原则在法律中的地位得到正式的肯定。在《合同法》中的第七条规定,所有从事民事活动的企业或者个人,都应当遵守社会公德,并要维护社会公共利益。 (二)合同法公序良俗原则的内涵和特征 公序良俗原则所适用的主体是所有从事民事活动的人,并要求这些民事主体在行使权力和履行义务的过程中,能够按照社会公共秩序办事,并能够尊崇善良风俗,否则就可以据此判定民事主体的行为是无效的。但是学术界对于公共秩序并没有形成一个统一的认知。不过其大致的范围可以归结为法律和政治范畴。这种界定的模糊性,也使得公共秩序一直随着时代的变迁在变化。而善良风俗不同,它本身源自于大众所普遍接受的道德和价值观念。所有与之相违背的行为,都应当是无效的,被摒弃的。这样看来,善良风俗具有一般法律价值标准,也是最为基本的道德规范。 (三)公序良俗原则的适用范围 公序良俗原则有着非常广阔的外延空间,在这一外延空间之下,公序良俗原则所涵盖的内容不仅仅局限于法律中的公共秩序当中,而且还涵盖了法律中未包含的秩序。这种更加自由的设定,使得公序良俗原则能够被灵活地引入到法律体系之内。这样一来,法律某些方面的制定滞后性就得到了有效的弥补,对于完善整个法律体系,以及促

位、字节、字、字长的关系

位、字节、字、字长的关系 我们来看看这几个让人纠结的概念,它们存在着密不可分的关系。 休闲时光,你们喜欢看电影吗?我们每个人去看电影都要买电影票,每个票对应一个座位,但是平时我们都喜欢和自己最爱的人在一起看电影,所以要组团看电影(*^__^*)。 一、位 首先我们要搞清楚一点:在计算机中所有数据都是以二进制数字存储的。这意味着计算机中数据存储的值只能是0或1。 因此,可以把我们每个人都看作这两个数字中的一个,我们每一个人对应电影院的一个座位。在计算机中,一个“位”(bit,简单记为b,也称比特)就是这样一个座位,可以存放0或者1。 一个位不能存放更多的信息。位是计算机数据运输的基本单位(最小的不可再分割的单位)。 一个二进制位只可以表示0和1两种状态,两个位可以表示00, 01, 10, 11,4=22种状态,三个位可以表示8=23种状态……以此类推,32位可以表示232种状态,64位可以表示264种状态。 计算机对数据有几种处理,其中数据存储和数据传输是两个重要的环节。 二、字节 在计算机这个大电影院中,有一条规则是现实中的电影院所不需要的:每个组团看电影的单位和团体的人数必须是8或者8的正整数倍。因此,2个,4个人组成一个团去看电影可是要被拒之门外的哦。

我们不妨给这样的8个成员的一个组起一个名字,对于计算机而言,8个位就是一个字节(Byte,简称B。位和字节都是数据单位)。28=256,所以一个字节单位的数据可以有256种组合方式(状态)。一个字节的二进制数最小为00000000,最大为11111111。 字节是计算机存储单元的基本计量单位,是计算机数据存储的基本单位。也就是说,计算机在进行数据传输的时候,允许传输的一个最小的数据块就是一个字节的数据。 一个字节可以存放一个英文字母(代表一个英文字母的二进制编码)、一个阿拉伯数字(同样是代表一个阿拉伯数字的二进制代码)以及半个汉字(二进制代码,一个完整的汉字需要两个字节长度的空间来存储)。 在微型计算机中,通常用多少字节来表示数据传输的数量: 1KB=1024B;1MB=1024KB=1024×1024B。其中1024=210。 1B(byte,字节)= 8 bit; 1KB(Kibibyte,千字节)=1024B= 210 B; 1MB(Mebibyte,兆字节,百万字节,简称“兆”)=1024KB= 220 B; 1GB(Gigabyte,吉字节,十亿字节,又称“千兆”)=1024MB= 230 B; 1TB(Terabyte,万亿字节,太字节)=1024GB= 240 B; 1PB(Petabyte,千万亿字节,拍字节)=1024TB= 250 B; 1EB(Exabyte,百亿亿字节,艾字节)=1024PB= 260 B; 1ZB(Zettabyte,十万亿亿字节,泽字节)= 1024EB= 270 B;

sizeof进行结构体大小的判断

sizeof进行结构体大小的判断 typedef struct { int a; char b; }A_t; typedef struct { int a; char b; char c; }B_t; typedef struct { char a; int b; char c; }C_t; void main() { char*a=0; cout<

2. 语法: sizeof有三种语法形式,如下: 1) sizeof( object ); // sizeof( 对象); 2) sizeof( type_name ); // sizeof( 类型); 3) sizeof object; // sizeof 对象; 5. 指针变量的sizeof 既然是来存放地址的,那么它当然等于计算机内部地址总线的宽度。所以在32位计算机中,一 个指针变量的返回值必定是4(以字节为单位),可以预计,在将来的64位系统中指针变量的sizeof结果为8。 char* pc = "abc"; int* pi; string* ps; char** ppc = &pc; void (*pf)();// 函数指针 sizeof( pc ); // 结果为4 sizeof( pi ); // 结果为4 sizeof( ps ); // 结果为4 sizeof( ppc ); // 结果为4 sizeof( pf );// 结果为4 指针变量的sizeof值与指针所指的对象没有任何关系,正是由于所有的指针变量所占内存大小相等,所以MFC消息处理函数使用两个参数WPARAM、LPARAM 就能传递各种复杂的消息结构(使用指向结构体的指针)。 6. 数组的sizeof 数组的sizeof值等于数组所占用的内存字节数,如: char a1[] = "abc"; int a2[3];

公序良俗原则

公序良俗原则 编辑 公序良俗,即公共秩序与善良风俗的简称,是法国、日本、意大利等大陆法系国家以及我国澳门和台湾地区民法典中使用的概念。在德国民法中,与公序良俗相当的概念是善良风俗。在英美法中,与此类似的概念则是公共政策。我国现行法并未采纳公序良俗的概念和表述,但《民法通则》第七条、《合同法》第七条和《物权法》第七条关于社会公德、社会公共利益和社会经济秩序的规定,通常被认为是承认了公序良俗原则。 目录 1简介 2理论依据 3分类 4民审适用 1 简介 所谓公序,即社会一般利益,在我国现行法上包括国家利益、社会经济秩序和社会公共利益。 所谓良俗,即一般道德观念或良好道德风尚,包括我国现行法上所称的社会公德、商业道德和社会良好风尚。

公序良俗原则在司法实践中应用非常广泛,因此,探讨这一原则在民事审判中的运用具有重要的意义。 2理论依据 公序良俗原则基本理论依据 是:“法无明文禁止即可为”和“权利不可滥用”的辨证统一性。“法无明文禁止即可为”意味着民事主体在不违背强制性法律规则和法律不禁止的条件下,可自愿选择满足或有利于自身利益的行为。“权利不可滥用”意味着对民事主体权利行使时,其行为应符合善良风俗习惯,并不损害政治国家和市民社会一般的公共秩序要求。尤其是在法律不足以评价主体行为时,公序良俗原则可以限制民事主体的意思自治及权利滥用。我国传统法律文化中,一贯注重“德行教化”的作用,并以此造就了中华法系偏重伦理性的法律精神,这为公序良俗原则在市场经济条件下的运用,提供了良好的思想基础。同时,由于我国社会主义市场经济体制的确立与发展,市民社会生活与交往日趋繁荣与复杂,这又为公序良俗原则的运用提供了广阔的社会基础。公序良俗来源于民事法律调整的固有缺陷,即市民社会生活交往的广泛性、复杂性、不稳定性与法律的不可穷尽性之间的矛盾。公序良俗原则的任务则是解决这一矛盾,以弥补法律的不足,维护社会公共利益,实现社会正义。 公序良俗原则 一方面是指民事主体在参与民事法律关系时,在不违背法律强制性规则的条件下,可以以及公共秩序的一般要求和善良的风俗习惯进行民事行为;另一方面,民事纠纷的仲裁者在法律规定不足或不违背强制性法律规范的条件下,可以运用公共秩序的一般要求与善良风俗习惯处理纠纷。根据公序良俗原则,民事法律制度对民事主体权利行使作出必须的法律限制性规定,加上公认的道德规范,形成了具有系统性的公序良俗。 3分类 一是政治国家公序; 二是市民社会善良风俗习惯; 三是他人人格尊严; 四是家庭道德关系准则; 五是其他公序良俗。 4民审适用 在大陆法系民法中,公序良俗原则主要用来控制法律行为,违反公序良俗的法律行为无效。在我国,司法实践中也曾出现援引民法通则第七条规定作出判决。应

结构体对齐

关于 C 语言中的结构体对齐 (1)什么是字节对齐 一个变量占用 n 个字节,则该变量的起始地址必须能够被n 整除,即: 存放起始地址 % n = 0 ,对于结构体而言,这个 n 取其成员种的数据类型占空间的值最大的那个。 (2)为什么要字节对齐 内存空间是按照字节来划分的,从理论上说对内存空间的访问可以从任何地址开始,但是在实际上不同架构的 CPU 为了提高访问内存的速度,就规定了对于某些类型的数据只能从特定的起始位置开始访问。这样就决定了各种数据类型只能按照相应的规则在内存空间中存放,而不能一个接一个的顺序排列。 举个例子,比如有些平台访问内存地址都从偶数地址开始,对于一个 int 型( 假设 32 位系统 ),如果从偶数地址开始的地方存放,这样一个读周期就可以读出这个 int 数据,但是如果从奇数地址开始的地址存放,就需要两个读周期,并对两次读出的结果的高低字节进行拼凑才能得到这个 int 数据,这样明显降低了读取的效率。 (3)如何进行字节对齐 每个成员按其类型的对齐参数 (通常是这个类型的大小 )和指定对齐参数 ( 不指定则取默认值 ) 中较小的一个对齐,并且结构的长度必须为所用过的所有对齐参数的整数倍 ,不够就补空字节。 这个规则有点苦涩,可以把这个规则分解一下,前半句的意思先获得对齐值后与指定对齐值进行比较 ,其中对齐值获得方式如下:

1. 数据类型的自身对齐值为:对于 char 型数据,其自身对齐值为 1 ,对于 short 型为 2 ,对于 int, long, float 类型,其自身对齐值为 4 ,对于 double 类型其自身对齐值为 8 ,单位为字节。 2. 结构体自身对齐值:其成员中自身对齐值最大的那个值。 其中指定对齐值获得方式如下: #pragma pack (value) 时的指定对齐值 value 。 未指定则取默认值。 后半句的意思是主要是针对于结构体的长度而言,因为针对数据类型的成员,它仅有一个对齐参数,其本身的长度、于这个对齐参数,即 1 倍。对于结构体而言,它可能使用了多种数据类型,那么这句话翻译成对齐规则:每个成员的起始地址 % 自身对齐值 = 0 ,如果不等于0 则先补空字节直至这个表达式成立。 换句话说,对于结构体而言,结构体在在内存的存放顺序用如下规则即可映射出来: ( 一)每个成员的起始地址 % 每个成员的自身对齐值 = 0 ,如果不等于 0 则先补空字节直至这个表达式成立; ( 二 ) 结构体的长度必须为结构体的自身对齐值的整数倍, 不够就补空字节。 举个例子: #pragmapack(8) structA{ chara; longb; }; structB{

plc编程中的字节 字 双字 整数 双整数 实数 之间的关系

字word 字节byte 位bit 整数分:1、int 带符号16位整数 2、dint 带符号32位整数双整数 real 浮点数实数32位 继续追问:它们之间有什么关系吗 补充回答:(1000位)1kb=1024字节,1字=2字节,1双字=2字=4字节,1字节=8位 整数有符号型与无符号型。 整数分 32位平台: short 在内存中占两个字节,范围为-2^15~(2^15-1) int 在内存中占四个字节,范围为-2^31~(2^31-1) long在内存中占四个字节,范围为-2^31~2^31-1 无符号型:最高位不表示符号位 unsigned short 在内存中占两个字节,范围为0~2^16-1 unsigned int 在内存中占四个字节,范围为0~2^32-1 unsigned long在内存中占四个字节,范围为0~2^32-1 实型变量: 分单精度float 和双精度double 两种形式: float:占四个字节,提供7~8位有效数字。 double: 占八个字节,提供15~16位有效数字。 (二)16位平台: 1)整型(基本型):类型说明符为int,在内存中占2个字节。 2)短整型:类型说明符为short int或short。所占字节和取值范围均与整型(基本型)相同。 3)长整型:类型说明符为long int或long,在内存中占4个字节。 无符号型:类型说明符为unsigned。 无符号型又可与上述三种类型匹配而构成: 各种无符号类型量所占的内存空间字节数与相应的有符号类型量相同。但由于省去了符号位,故不能表示负数。 实型变量: 分为单精度(float型)、双精度(double型)和长双精度(long double型)三类。 单精度型占4个字节(32位)内存空间,其数值范围为3.4E-38~3.4E+38,只能提供七位有效数字。 双精度型占8 个字节(64位)内存空间,其数值范围为1.7E-308~1.7E+308,可提供16位有效数字。 长双精度型16 个字节(128位)内存空间,可提供18-19位有效数字。

内存对齐方式

对齐方式 为什么会有内存对齐? 在结构中,编译器为结构的每个成员按其自然对界(alignment)条件分配空间;各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。在缺省情况下,C编译器为每一个变量或数据单元按其自然对界条件分配空间。 字,双字,和四字在自然边界上不需要在内存中对齐。(对字,双字,和四字来说,自然边界分别是偶数地址,可以被4整除的地址,和可以被8整除的地址。)无论如何,为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;然而,对齐的内存访问仅需要一次访问。 一个字或双字操作数跨越了4字节边界,或者一个四字操作数跨越了8字节边界,被认为是未对齐的,从而需要两次总线周期来访问内存。一个字起始地址是奇数但却没有跨越字边界被认为是对齐的,能够在一个总线周期中被访问。 某些操作双四字的指令需要内存操作数在自然边界上对齐。如果操作数没有对齐,这些指令将会产生一个通用保护异常(#GP)。双四字的自然边界是能够被16整除的地址。其他的操作双四字的指令允许未对齐的访问(不会产生通用保护异常),然而,需要额外的内存总线周期来访问内存中未对齐的数据。 影响结构体的sizeof的因素: 1)不同的系统(如32位或16位系统):不同的系统下int等类型的长度是变化的,如对于16位系统,int的长度(字节)为2,而在32位系统下,int的长度为4;因此如果结构体中有int等类型的成员,在不同的系统中得到的sizeof值是不相同的。 2)编译器设置中的对齐方式:对齐方式的作用常常会让我们对结构体的sizeof 值感到惊讶,编译器默认都是8字节对齐。 对齐: 为了能使CPU对变量进行高效快速的访问,变量的起始地址应该具有某些特性,即所谓的“对齐”。例如对于4字节的int类型变量,其起始地址应位于4字节边界上,即起始地址能够被4整除。变量的对齐规则如下(32位系统)

试述公序良俗原则

浅析公序良俗原则 内容摘要 公序良俗原则与诚实信用原则一样,是市民社会极其市场经济活动中的道德规范上升为民事法律规范的反映,体现了民法规范与整个社会道德规范的统一,同是也体现了市场经济的客观要求。公序良俗原则在司法实践中应用非常广泛,因此,探讨这一原则在民事审判中的运用具有重要的意义。本文 一、公序良俗的概念 公序良俗,是由公共秩序和善良风俗两个概念构成的。所谓公共秩序,即社会一般利益,在我国现行法上包括国家利益、社会经济秩序和社会公共利益。所谓善良风俗,即一般道德观念或良好道德风尚,包括我国现行法上所称的社会公德、商业道德和社会良好风尚。公序良俗原则,是指民事主体在进行民事活动时不得违反公共秩序和善良风俗,不得为反社会一般道德和国家的一般利益的原则。 二、我国对公序良俗原则的规定 在我国大陆,民事立法并未使用“公序良俗”的概念,而以“社会公德”和“社会公共利益”的用语表达相同的立法精神。《民法通则》第7条规定:“民事活动应当尊重社会公德,不得损害社会公共利益,破坏国家经济计划,扰乱社会经济秩序。”第55条规定:“民事法律行为应当具备的条件之一是不违反法律或社会公共利益。”第58条规定:“违反法律或者社会公共利益的民事行为无效。”《继承法》中规定:“继承权男女平等。对不尽扶养义务的人,分配遗产时,应当不分或少分。这些条款无不体现了公序良俗原则的应用和影响。” 三、将公序良俗原则纳入民事立法的现实意义 1、有利于平衡个人与社会公共利益,实现市民的社会完全价值。 我国社会主义法,在本质上是广大人民群众的意志和利益的体现。在市民社会中,个人自由的空间增大,多元价值取向的个人意志得到充分发挥,个人权利受到尊重。个人利益与社会利益相冲突正是公序良俗原则诞生的客观条件,因此,立法必须反映保障最大多数的最大利益,维护社会秩序和善良风俗。 2、有利于合理协调强行法规定的适用范围。民事活动纷繁复杂,强 行法不可能对其一一作出规定,而违反社会普遍接受的道德准则,不仅可能会给当事人造成损害,也会造成对社会秩序的妨害。这就需要采用公序良俗原则,以之作为强行法的组成部分,从而配合各种具体的强行法规则对民事活动起调控作用。 3、有利于为审判案件提供法律依据,限制法官滥用自由裁量权

位、字节、帧各自的定义和关系(精)

“位”也称“比特”或“信息量” ------ bps(bits per second每秒比特数 bps 是网络传输中一个最基本的网速单位,而比特流常用于拨号上网时代,最快的网速也就几十 kbps(1024bps,常指在网络中传输的数据流,也就是说上网比特流 两个概念: 1 计算机专业术语, 是信息量单位, 是由英文 BIT 音译而来。二进制数的一位所包含的信息就是一比特,如二进制数 0101就是 4比特。 2 二进制数字中的位,信息量的度量单位,为信息量的最小单位。数字化音响中用电脉冲表达音频信号,“ 1”代表有脉冲,“ 0”代表脉冲间隔。如果波形上每个点的信息用四位一组的代码表示,则称 4比特,比特数越高,表达模拟信号就越精确,对音频信号信号还原能力越强。 计算机中的位 二进制数系统中, 每个 0或 1就是一个位 (bit, 位是数据存储的最小单位。其 中 8bit 就称为一个字节 (Byte 。计算机中的 CPU 位数指的是 CPU 一次能处理的最大位数。例如 32位计算机的 CPU 一次最多能处理 32位数据。 Bit ,乃 BInary digit(二进制数位的缩写,是数学家 John Wilder Tukey提议的术语(可能是 1946年提出,但有资料称 1943年就提出的 字节 字节(Byte :字节是通过网络传输信息(或在硬盘或内存中存储信息的单位。 字节是计算机信息技术用于计量存储容量和传输容量的一种计量单位, 1个字节等于 8位二进制。

帧 帧的传输 -----在网络中,网络设备将“位”组成一个个的字节,然后这些字节“封装” 成帧,在网络上传输。为什么要把数据“封装”成帧呢?因为用户数据一般都比较大, 有的可以达到 MB 字节, 一下子发送出去十分困难, 于是就需要把数据分成许多小份,再按照一定的次序发送出去。 在网络中,网络设备将“位”组成一个个的字节,然后这些字节“封装”成帧,在网络上传输。为什么要把数据“封装”成帧呢?因为用户数据一般都比较大,有的可以达到MB 字节, 一下子发送出去十分困难, 于是就需要把数据分成许多小份, 再按照一定的次序发送出去。 以太网的帧值总是在一定范围内浮动,最大的帧值是 1518字节,最小的帧值是64字节。在实际应用中,帧的大小是由设备的 MTU (最大传输单位即设备每次能够传输的最大字节数自动来确定的。 帧是当计算机发送数据时产生的,确切地说,是由计算机中安装的网卡产生的。帧只对于能够识别它的设备才有意义。对于集线器来说,帧是没有意义的,因为它是物理层设备,只认识脉冲电流。有许多人对帧不理解,所以不能很好地理解交换机与集线器的区别。 看了以上这么多, 也许你还是不明白, 其实, 二进制并不是网管员要打交道的东西, 而帧才是网管员真正要注意的东西, 所以在 Windows 2000的“网络监视器” 中, “帧” 才是被监视的对象。但我们究竟怎样监视帧呢? 网络上的帧 ---数据在网络上是以很小的称为帧(Frame 的单位传输的,帧由几部分组成, 不同的部分执行不同的功能。帧通过特定的称为网络驱动程序的软件进行成型,然后通过网卡发送到网线上,通过网线到达它们的目的机器,在目的机器的一端执行相反的

c++中关于结构体长度的计算问题

[C++]字节对齐与结构体大小 [C++] 2010-09-24 21:40:26 阅读172 评论0 字号:大中小订阅 说明: 结构体的sizeof值,并不是简单的将其中各元素所占字节相加,而是要考虑到存储空间的字节对齐问题。这些问题在平时编程的时候也确实不怎么用到,但在一些笔试面试题目中出是常常出现,对sizeof我们将在另一篇文章中总结,这篇文章我们只总结结构体的sizeof,报着不到黄河心不死的决心,终于完成了总结,也算是小有收获,拿出来于大家分享,如果有什么错误或者没有理解透的地方还望能得到提点,也不至于误导他人。 一、解释 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如

有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int 型(假设为32位系统)如果存放在偶地址开始的地方,那么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方,就需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该32bit数据。 二、准则 其实字节对齐的细节和具体编译器实现相关,但一般而言,满足三个准则: 1. 结构体变量的首地址能够被其最宽基本类型成员的大小所整除; 2. 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节; 3. 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。 三、基本概念

公序良俗原则及其司法适用

公序良俗原则及其司法适用 发布日期:2011-05-10 文章来源:北大法律信息网 【摘要】公序良俗作为现代民法一项重要的法律概念和法律原则,在民法体系中占有重要地位。科学地界定公序良俗的概念,是本文论述的基点,也可以有效地防止其不确定性所带来的严重的负面效果。但要对其进行深入的解读,不能期望一个完美的概念界定,而应该变换视角,从该原则与道德、现行法秩序的区分来界定公序良俗的基本要素。为进一步认识公序良俗原则,应该明确公序良俗原则在经济社会发展中的适用范围。由于公序良俗原则在我国民法理论中与诚实信用原则、禁止权利滥用原则有很大的混同性,笔者将该原则与诚实信用原则、禁止权利滥用原则进行了全面的比较。公序良俗原则在我国民法中不仅仅具有其他基本原则共有的功能,更有自身独有的功能。这也为本文界定了论域。公序良俗是私法上控制私人自治、检视法律行为效力的阀门之一。当一个法律行为违背公序良俗的情况时,禁止发生当事人预期的法律后果。然而,由于该原则自身的因素和我国司法环境的原因也就决定了它潜藏着以维护伦理道德之名侵害私人自治的致命危险性,立法上所保障的个人自由可能在司法的层面被公权力销蚀而化为乌有。故, 公序良俗原则易被我国司法滥用,而一旦被滥用将产生严重的危害后果。为防止公序良俗原则的司法滥用,必然要求明确公序良俗原则的判断标准,进而实现其判断标准的客观化、具体化。为此,笔者从哲学、主体、地域角度全面地介绍了公序良俗原则判断标准的各种因素理论。那么,在实体法上怎么将这些判断标准应用于对公序良俗的判断来避免该原则被滥用呢?对此,我国学术界力主案件类型化理论来实现这一目标。笔者在明晰公序良俗原则案件类型化理论之后,明确提出:该方法由于自身的缺陷和我国司法环境的特殊性因素,案件类型化理论并不能担当此大任。既然实体法无法防止该原则被滥用,笔者考虑到公序良俗原则的高技术含量,将这一问题转化为程序问题加以解决。在程序法上,首先要解决的问题是在程序上防止借助公序良俗原则向一般条款逃避。对于公序良俗的认定的主体而言,难道一定要由法官来担任吗?对此,笔者认为法官并不能担当此大任,公序良俗的认定应由民众来完成,而人民的陪审团制度为此提供了制度的保障。在此理论基础上,笔者主张,在我国民事诉讼法改革的大背景下建立以陪审团制度为基础上公序良俗案件诉讼制度,从而在程序上确保该原则的功能和作用的实现。 第一章公序良俗基本原则之再解读 《民法通则》第7条规定:“民事活动应当尊重社会公德,不得损害公共利益、破坏 国家计划、扰乱社会经济秩序”。对于这一规定我国大部分学者(梁慧星、王利明 等)都将这一条解释为实质上是公序良俗原则的规定[4],当然也有一部分学者(如 申卫星、李开国)同时又将该条解释为禁止权利滥用原则,也有一部分学者主张 仅仅将该条解释为禁止权利滥用原则[5]。那么,究竟何谓公序良俗原则,其又有什 么功能和作用,在我国制定未来民法典时又如何防止这种解释的混乱呢? 第一节公序良俗原则的含义

内存字节对齐

1.内存字节对齐和小端模式: /* 本程序是关于:编译器内存的字节对齐方式和存储时的小端对齐模式(win7 32bit) #pragma pack(n) 默认为8字节对齐,(即n=8)其中n的取值为1,2,4,8,16,32等 内存字节对齐大小和方式: 1)结构体内变量对齐: 每个变量的对齐字节数大小argAlignsize=min(#pragma pack(n),sizeof(变量)); 方式:结构体的第一个变量的初始偏移地址为0,其它变量的偏移地址(当前变量的起始地址)必须是argAlignsize的整数倍,不够整数倍的补空,不添加任何数据 2)结构体对齐: 结构体的对齐字节数大小strAlignsize=min(#pragma pack(n),sizeof(所有变量中最大字节的变量)) 方式: A.对于单独的结构体来说,结构体本身按照strAlignsize大小来对齐 B.结构体B在结构体A中时,结构体B的起始地址是结构体B的 strAlignsize大小的整数倍 小端对齐模式: 指针指着一个存储空间,存储空间地址由低到高的存储内容为:0x78,0x67,0x33,0x45 若指针为char,则获取的数据为0x78 若指针为short,则获取的数据为0x6778 若指针为long,则获取的数据为0x45336778 */ #include using namespace std; /*更改C编译器内存的缺省字节对齐方式,由默认的n=4字节,变为n字节对齐,其中n的取值为1,2,4,8,16,32等*/ #pragma pack(2) struct A { unsigned char a; unsigned short b; }; struct B { unsigned char c; unsigned int d;

bit与byte的区别,字节与字长的区别

Bit意为“位”或“比特”,是计算机运算的基础,属于二进制的范筹; Byte意为“字节”,是计算机文件大小的基本计算单位; 这两者应用的场合不同。通常用bit来作数据传输的单位,因为物理层,数据链路层的传输对于用户是透明的,而这种通信传输是基于二进制的传输。在应用层通常是用byte来作单位,表示文件的大小,在用户看来就是可见的数据大小。比如一个字符就是1byte,如果是汉字,则是2byte。 下面是2个具体应用实例: Mbps=mega bits per second(兆位/秒)是速率单位, MB=mega bytes(兆比、兆字节)是量单位,1MB/S(兆字节/秒)=8MBPS(兆位/秒)。 我们所说的硬盘容量是40GB、80GB、100GB,这里的B指是的Byte也就是“字节”。(与容量相关,应用层) 1 bit = 1 二进制数据 1 byte = 8 bit 1 字母= 1 byte = 8 bit 1 汉字= 2 byte = 16 bit 1Byte=8Bit=1字节 1字=2字节 1. bit:位 一个二进制数据0或1,是1bit; 2. byte:字节 存储空间的基本计量单位,如:MySQL中定义 VARCHAR(45) 即是指45个字节; 1 byte = 8 bit1. bit:位 一个二进制数据0或1,是1bit; 1 KB = 1024 bytes =2^10 bytes 1 MB = 1024 KB = 2^20 bytes 1 GB = 1024 MB = 2^30 bytes USB2.0标准接口传输速率是480兆位/秒,即480MBps。这里的B指是的Bit也就是“位”。(与传输相关,底层) 注:另外,Byte通常简写为B(大写),而bit通常简写为b(小写)。可以这么记忆,用大写的就是数据值比较大的位,而小字的就是数据值比较小的字节,1B=8b。 位:在数字电路和电脑技术中采用二进制,代码只有“0”和“1”,其中无论是“0”或是“1”在CPU中都是一“位”。 字长:电脑技术中对CPU在单位时间内(同一时间)能一次处理的二进制数的位数叫字长。所以能处理字长为8位数据的CPU通常就叫8位的CPU。同理32

程序设计与问题求解下实验答案

实验数组、结构体和函数综合编程练习 1.学生成绩统计 从键盘输入一个班(全班最多不超过30 人)学生某门课的成绩,当输入成绩为 负值时,输入结束,分别实现下列功能: (1)统计不及格人数并打印不及格学生名单; (2)统计成绩在全班平均分及平均分之上的学生人数,并打印这些学生的名单;(3)统计各分数段的学生人数及所占的百分比。 注:将成绩分为六个分数段,60 分以下为第0 段,60~69 为第1 段,70~79 为第2 段,80~89 为第3 段,90~99为第4 段,100 分为第5 段。 编程要求: 1. 较好的用户输入输出提示信息 2. 使用子函数来实现上述各个功能,并且要使用结构体数组来实现,该结构体中包括学生学号和成绩 3. 最好不要使用全局变量 #include #define ARR_SIZE 30 typedef struct tagStudent { long num;//学生学号 float score;//学生分数 }Student; int ReadScore(Student stu[]); int GetFail(Student stu[], int n); float GetAver(Student stu[], int n); int GetAboveAver(Student stu[], int n); void GetDetail(Student stu[], int n); main()

{ int n, fail, aboveAver; Student stu[ARR_SIZE]; printf("Please enter num and score until score<0:\n"); n = ReadScore(stu); printf("Total students:%d\n", n); fail = GetFail(stu, n); printf("Fail students = %d\n",fail); aboveAver = GetAboveAver(stu, n); printf("Above aver students = %d\n", aboveAver); GetDetail(stu, n); } /* 函数功能:从键盘输入一个班学生某门课的成绩及其学号当输入成绩为负值时,输入结束 函数参数:存放学生信息的Student 结构体数组 函数返回值:学生总数 */ int ReadScore(Student stu[]) { int i = 0; scanf("%ld%f", &stu[i].num, &stu[i].score); while (stu[i].score >= 0) { i++; scanf("%ld%f", &stu[i].num, &stu[i].score); } return i; } /* 函数功能:统计不及格人数并打印不及格学生名单 函数参数:存放学生信息的Student 结构体数组 整型变量n,存放学生总数 函数返回值:不及格人数 */ int GetFail(Student stu[], int n) { int i, count;

浅论公序良俗原则及其适用

浅论公序良俗原则及其适用 摘要:法律原则的适用以法无规定和个案正义为条件,随着社会的发展,各种立法时未顾及到的现象时有发生,而法律规则却也无能为力。“公序良俗原则”的适用似乎暂时缓解了这一困难,但是目前在我国,该原则的适用仍然面临着诸多困难。在探其理论的基础上,找出其判定、操作等方面的不足,并相应的提出解决办法,是讨论之道。 关键字:公序良俗原则司法实践适用 公序良俗原则是现代民法一项重要的法律概念和基本的法律原则。在现代市场经济社会中,公序良俗原则具有“克服规则模式僵化、授予法官自由裁量权、追求实质正义等重要功能”。因此它被称为现代民法至高无上的基本原则。但公序良俗也因其自身无法避免的矛盾性和危险性在司法实践中多惹争议,其适用尚存在诸多问题,如其具体内涵和判断标准,能否在司法实践中被直接的适用,以及如何正当适用等。因此,公序良俗原则在当今社会中的司法适用仍应值得探讨,一、公序良俗原则的内涵 (一)公序良俗原则的概念 所谓公序良俗原则,准确的说我国民事法律并没有明确的对其作出规定,而是一种近似原则。《民法通则》第七条规定“民事活动应当尊重社会公德,不得损害社会公共利益,破坏国家经济计划,扰乱社会经济秩序。”我国学者通说认为,这一规定中的“社会公共利益”近似于外国民法典的“公共秩序”;“社会公德”近似于外国民法典中的“善良风俗”,因此,可以将我国《民法通则》第七条的规定概括为“公序良俗”原则。 关于“公序良俗”的定义,从上文的描述中,不难发现它是包括两个部分的,是“公共秩序”和“善良风俗”的简称。公共秩序也即人类的公共生活秩序,是随着人类社会的不断发展,逐渐形成的规范人们行为,引导正确价值观,与人们的基本利益、国家和社会的基本利益相统一的社会规则。善良风俗是指社会的存在及其发展所必要的一般道德,它是人们应当遵守的最低限度的道德的法律化。二者的相互交融、相辅相成构成了完整的公序良俗原则。但是,各国也会因社会环境与法律环境的差异,而出现一些表述与内容上的差异,但其本质都是围绕着“公序良俗”这一民法的基本原则而展开的。 (二)公序良俗原则的历史沿革 公序良俗的观念最早起源于罗马法,随后逐渐被德、意、法等国的民法所采用。1804年的《法国民法典》第一次规定了公序良俗原则,该法典第六条规定:“当事人不得以特别约定违反有关公共秩序与善良风俗的法律。”《法国民法典》采

C语言结构体的字节对齐及指定对齐方式

内存中结构体的内存对齐 一、字节对齐作用和原因: 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐,其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始的地方,那么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方,就需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该32bit 数据,显然在读取效率上下降很多。 二、字节对齐规则: 四个重要的概念: 1.数据类型自身的对齐值:对于char型的数据,其自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4个字节。 2.结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值。 3.指定对齐值:#pragma pack (value)时指定的对齐value。 4.数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中小的那个值。补充: 1).每个成员分别按自己的方式对齐,并能最小化长度。 2).复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度。 3).对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐。 #pragma pack(1) struct test { static int a; //static var double m4; char m1; int m3; } #pragma pack() //sizeof(test)=13;

双字、字、字节和位的关系总结

双字、字、字节和位的关系总结 一、资料查询: 相信从网上搜一下西门子数据类型方面的资料,会有一大堆,最常见的就是解释双字和字节之间的组成关系,如下图: 就以这个资料为基础,进行试验验证; 二、程序准备 由于资料上大部分都是以M区介绍双字和字节等关系,但是实际情况是DB块中的数据居多,故在此实验中,将M区和DB区的内容进行对比,以方便观察,进行如下准备: 1、新建DB块,里面创建需要的变量: 2、创建M区变量,以方便做比较,这里取MD24,然后将其拆成字、字节、位,以方便观察: 3、创建FC程序:主要是将双字拆成字、双字,并将双字传送给单字、单字传送给双字,为了方便置位双字中的位,特意用数组逐位传送给双字中的位:

三、程序验证: 省略掉程序的下载啊、仿真啊的操作步骤,因为那个不是重点,直接展示测试结果:从数组中,分别置位不同的位,则相当于分别对双字中的位进行置位,可以分别观察结果,现在取比较有代表性的两个位,即将第0位和第16位置1,结果如下两图所示: 通过测试可以发现如下规律: 1、西门子双字中位的排列,是从右向左排的,这点和平时写字顺序正好相反,但是我觉得可以从进制的位数去记忆一下,比如我们十进制,从右往左分别是个、十、百、千、万等位,这个正好类似于那个; 2、可以看下双字传给单字的情况,对于截取数据时候比较有帮助,具体不总结,可以体会一下; 3、第三条也是我一开始比较迷糊的地方,观察双字的四个字节,和位的排序是一样的,即0位在右,依次往左增大,但是M区其实按照这个方向排列,但是让人很迷糊,上图为例,我们置位0位的时候,在DB中是第0个字节有变化,但是在M区中对应的是MB27变化,虽然按照一开始资料所示,MB27是在

实验8结构体应用

实验8。结构体应用—-—10081 学生成绩统计(结构体) 1。【问题描述】用结构数组实现学生成绩统计各功能。?某班有N(N<=30)个学生,共开设5门课程,分别用三个函数实现如下功能:?⑴求第一门课程得平均分; ⑵找出有2门及2门以上不及格得学生,并输出其学号; ⑶找出平均成绩在90分及以上得学生,输出她们得学号。 【输入形式】第一行为一个整数N,表示本班共N个人,接下来得N行中每行包含一个学生得信息,包括学号(长度 小于11得字符串)、课程1成绩、课程2成绩、课程3成绩、课程4成绩、课程5成绩。成绩均为整数。?【输出形式】输出共三行:?第一行为本班第一门课程得平均成绩。(保留小数点后两位) 第二行为有2门及2门以上不及格得学生得学号,各学号之间用一个空格分隔。若不存在,则打印”no”、 第三行为平均成绩在90分及以上得学生得学号, 各学号之间用一个空格分隔、若不存在,则打印"no"。 ?【样例输入】3 070002 93 95 90 88 92 0700019080 85 50 42? 070003 9892 84 90 91 【样例输出】93、67 070001?070002070003?【样例说明】本班有3个学生。?第1个学生学号为: 070001, 5门课程得成绩分别为: 90、80、85、50、42;?第2个学生学号为: 070002, 5门课程得成绩分别为:93、95、90、88、92;?第3个学生学号为: 070003, 5门课程得成绩分别为: 98、92、84、90、91。 本班第1门课程得平均成绩为: 93。67;有2门及2门以上不及格得学生得学号为: 070001; 平均成绩在90分及以上得学生得学号为: 070002、070003。?【评分标准】本题共2个测试点,每个测试点1、0分,共2。0分。 #include <stdio.h> structstudent { char num[10]; intb[5]; }a[30]; int main() { voideverage(structstudent*p1,int m); voidfailure(struct student*p2,int m); void success(struct student*p3,int m); int n,i; scanf(”%d",&n); for(i=0;i<n;i++) scanf("%s%d%d%d%d%d”,a[i]、num,&a[i]、b[0],&a[i]。b[1],&a[i]。b[2],&a[i]。b[3],&a[i]。b[4]); everage(a,n); failure(a,n); success(a,n); return0; } voideverage(structstudent*p1,int m) {

相关文档
最新文档