信息安全系统设计基础第三周学习总结——20135308

信息的表示和处理

本周,我阅读了教材的第二章内容,学习了信息的数字表示。

1.三种数字表示

  • 无符号

基于传统二进制表示法,表示大于或者等于零的数字。

  • 补码

表示有符号整数的最常见方式

  • 浮点数

表示实数的科学计数法的以二为基数的版本。

2.信息存储

1.进制

二进制、八进制、十进制、十六进制(转换:以二进制作为中间变量)

十六进制:以0x或0X开头表示,字符A-F可大写可小写。


2.字

虚拟地址是以这样的一个字来编码的。

每台计算机都有一个字长,指明整数和指针数据的大小。

字长决定虚拟地址空间的最大大小,字长决定的最重要的系统参数就是虚拟地址空间的最大大小。对一个字长为w位的机器,虚拟地址的范围为0-2^(w-1),程序最多访问2^w个字节。


3.数据大小

C语言支持整数和浮点数的多种数据格式


4.寻址和字节顺序

小端法——在存储器中按照从最低有效字节到最高有效字节的顺序存储对象。

大端法——从最高有效字节到最低有效字节的顺序存储。

(小端法:高对高,低对低。大端法:高对低,低对高。)

举例:变量x十六进制值为0x01234567,


5.表示字符串

ASCⅡ字符码

a-z的ASC||码为0x61-0x7A。


6.表示代码

二进制代码是不兼容的。


7.布尔代数

二进制值是计算机编码、存储、操作信息的核心(0、1)

逻辑运算——0或1

位运算————位向量

~=NOT

&=AND

|=OR

^=异或

*位向量:有固定长度为w,由0、1组成的串。每个对应元素之间的运算。 掩码。通过指定一个位向量掩码,有选择的使能或不能屏蔽一些信号。(0表示被屏蔽)


8.C语言中的位级运算

我们在布尔运算中使用的那些符号就是C语言所使用的:

|就是OR(或)

&就是AND(与)

~就是NOT(取反)

^就是EXCLUSIVE-OR(异或)

确定一个位级表达式的结果最好的方法,就是将十六进制的参数扩展成二进制标识并执行二进制运算,然后再转换回十六进制。


9.C语言中的逻辑运算

|| OR

&& AND

! NOT

所有非零的参数表示TRUE

参数0表示FALSE

它们返回1或者0,分别表示结果为TRUE或FALSE


10.C语言中的移位运算

(1)x<<k 表示x向左移动k位

(2)x>>k 表示逻辑右移或算术右移


3.整数表示

1. 无符号数编码

数据类型long long是在ISO C99中引入的。(编译:gcc -std=c99)。

64位机器用8个字节表示;32位机器用4个字节表示。

*负数的范围比整数的范围大1。


2.补码编码

最常见的有符号数的计算机表示方式。

正数的补码=原码

负数的补码=原码各位取反再加1

最高有效位也叫符号位。


3.无符号数与有符号数转换

强制类型转换的结果保持位值不变,改变解释这些位的方式。

处理同样字长的有、无符号数之间相互转换的规则:数值可能会变,但是位模式不变。(底层的位表示保持不变)

无————>有:U2Tw函数

有————>无:T2Uw函数

*w表示数据类型的位数


4.扩展数字的位表示

零扩展:将一个无符号数转换为一个更大的数据类型,在开头添0。

符号扩展:将一个补码数字转换为一个更大的数据类型,添加最高有效位的值的副本。


5.截断数字

可能会改变数值——溢出的一种形式。

对于无符号数字x,截断到k位,相当于计算:x mod 2(k)。(k次幂)


4.整数运算

1. 无符号加法是一种模运算形式。


2.溢出

一个算术运算的溢出——完整的整数结果不能放到数据类型的字长限制中。

x+y>=x,若s没有溢出,可以肯定s>=x;若s溢出,s=x+y-2^(w).

*s=x+(u w)y. x>=0,y<=2^(w)-1,均是非负整数。

整数运算实际上是一种模运算形式。表示数字的有限字长限制了可能的值得取值,结果可能溢出。


5.浮点数

1.二进制小数

定点表示法:“.”为界(不能有效的表示很大的数)

十进制:小数点左边的数字的权是10的非负幂,得到整数值;右边的数字的权是10的负幂,得到小数值。

二进制:小数点左边的数字的权是2的非负幂,右边的数字的权是2的负幂。


2.IEEE浮点表示

1.用V = (-1)s * M * 2E的形式来表示一个数:

符号:s决定这个数是负数(s = 1)还是正数(s = 0),而对于数值0的符号位解释作为特殊情况处理。

尾数:M是一个二进制小数,它的范围是1 ~ 2-ε,或者是0 ~ 1-ε。

阶码:E的作用是对浮点数据加权,这个权重是2的E次幂(可能是负数)。

2.将浮点数的位表示划分为三个字段,分别对这些值进行编码:

一个单独的符号位s直接编码符号s。

k位的阶码字段exp = ek-1…e1e0编码阶码E。

n位小数字段frac = fn-1…f1f0编码尾数M,但是编码出来的值也依赖于阶码字段的值是否等于0。

3.两种常见的格式

C语言中的单精度浮点格式float 和双精度浮点格式double。

在float中,s、exp和frac字段分别为1位、k = 8 位和n = 23位,得到一个32位的表示;

在double中,s、exp和frac字段分别为1位、k = 11 位和n = 52位,得到一个64位的表示。


6.作业重点题目:

2.4、2.6、2.8、2.11、2.13、2.14、2.18、2.19、2.21、2.23、

2.24、2.25、2.27、2.29、2.33、2.34、2.39、2.40、2.42、2.43、

2.44、2.45、2.47、2.50、2.52、2.54

代码:

#include <stdio.h>
typedef unsigned char *byte_pointer;
void show_bytes(byte_pointer start, int len)
{
    int i;
    for(i = 0;i<len;i++)
    {
        printf("%.2x",start[i]);
    }
    printf("\n");
}
void show_int(int x)
{
    show_bytes((byte_pointer) &x, sizeof(int));
}
void show_float(float x)
{
    show_bytes((byte_pointer) &x, sizeof(float));
}
void show_pointer(void *x)
{
    show_bytes((byte_pointer) &x, sizeof(void *));
}
void test_show_bytes(int val)
{
    int ival = val;
    float fval = (float)ival;
    int *pval = &ival;
    show_int(ival);
    show_float(fval);
    show_pointer(pval);
}
void main()
{
    int val;
    printf("please enter an int:\n");
    scanf("%d",&val);
    test_show_bytes(val);
}

7.遇到的问题及解决

8.总结

本周的书本内容需要掌握的有许多,不如做实验一样直观能懂,需要仔细精度书本,查找相关内容,勤加练习才能搞清楚。我还在练习老师留的课后重点习题,碰见新学到的知识点以及不懂的题会随时更新。

posted @ 2015-10-02 00:39  bonjourvivi  阅读(164)  评论(0编辑  收藏  举报