• 2018-2019-1 20165325 《信息安全系统设计基础》第二周学习总结


    2018-2019-1 20165325 《信息安全系统设计基础》第二周学习总结

    一、学习笔记

    1. 计算机将信息编码为位(比特),通常组成字节序列。
    2. 大多数计算机对整数使用补码编码,而对浮点数使用IEEE标准754编码。
    3. C语言实现的有限整数运算和真实的整数运算相比,有一些特殊的属性。例如由于溢出,表达式x*x会得到负数。
    4. 在相同长度的无符号和有符号整数之间进行强制类型转换时,大多数C语言实现遵循的原则是底层的位模式不变。
    5. 浮点表示通过将数字编码为x*2^y的形式近似地表示实数。最常见的浮点表示方式是由IEEE标准754定义的。
    6. 浮点运算只有有限的范围和精度,而且不遵守普遍的算术属性,比如结合性。
    7. C和C++都支持有符号数和无符号数。java只支持有符号数。
    8、最低有效字节在最前面的方式,称为小端法;反之称为大端法。

    二、班课作业

    水平有限,班课作业暂时没做出来,参考代码如下:

    #include <stdio.h>
    #include <assert.h>
    
    int float_f2i(float_bits f) {
      unsigned sig = f >> 31;
      unsigned exp = f >> 23 & 0xFF;
      unsigned frac = f & 0x7FFFFF;
      unsigned bias = 0x7F;
    
      int num;
      unsigned E;
      unsigned M;
    
      
      if (exp >= 0 && exp < 0 + bias) {
    
        num = 0;
      } else if (exp >= 31 + bias) {
    
        num = 0x80000000;
      } else {
        E = exp - bias;
        M = frac | 0x800000;
        if (E > 23) {
          num = M << (E - 23);
        } else {
    
          num = M >> (23 - E);
        }
      }
    
      return sig ? -num : num;
    }
    
    
    
    int bits_length(int i) {
      if ((i & INT_MIN) != 0) {
        return 32;
      }
    
      unsigned u = (unsigned)i;
      int length = 0;
      while (u >= (1<<length)) {
        length++;
      }
      return length;
    }
    
    
    unsigned bits_mask(int l) {
      return (unsigned) -1 >> (32-l);
    }
    
    
    float_bits float_i2f(int i) {
      unsigned sig, exp, frac, rest, exp_sig, round_part;
      unsigned bits, fbits;
      unsigned bias = 0x7F;
    
      if (i == 0) {
        sig = 0;
        exp = 0;
        frac = 0;
        return sig << 31 | exp << 23 | frac;
      }
      if (i == INT_MIN) {
        sig = 1;
        exp = bias + 31;
        frac = 0;
        return sig << 31 | exp << 23 | frac;
      }
    
      sig = 0;
    
      if (i < 0) {
        sig = 1;
        i = -i;
      }
    
      bits = bits_length(i);
      fbits = bits - 1;
      exp = bias + fbits;
    
      rest = i & bits_mask(fbits);
      if (fbits <= 23) {
        frac = rest << (23 - fbits);
        exp_sig = exp << 23 | frac;
      } else {
        int offset = fbits - 23;
        int round_mid = 1 << (offset - 1);
    
        round_part = rest & bits_mask(offset);
        frac = rest >> offset;
        exp_sig = exp << 23 | frac;
    
    
        if (round_part < round_mid) {
    
        } else if (round_part > round_mid) {
          exp_sig += 1;
        } else {
    
          if ((frac & 0x1) == 1) {
    
            exp_sig += 1;
          }
        }
      }
    
      return sig << 31 | exp_sig;
    }
    
    

    将于近期补做,参考链接

    三、问题日志

    1、使用IEEE 754 Calculator查看浮点数

    发现在线工具,IEEE 754 Calculator可查看浮点数编码格式。

    2、计算表达式 200 300 * 400 * 500 会得出结果-884901888

    说法不严谨,实际上只有32位计算机会出现这种情况,64位计算机不会发生溢出,所以结果是正确值。

    也就是说发生了溢出,只保留末32位,才得到了-884901888这个值。

    3、机器的大端小端问题

    书上给的机器运行结果可能不是和每个同学的机器都一样,运行之前最好检查一下自己机器是大端还是小端,不然可能浪费很多时间。

    参考链接:如何判断一个机器是大端还是小端

    4、十六进制表示法

    以0x或者0X开头的数字常量被认为是16进制,字符“A”~“F”既可以是大写也可以是小写

  • 相关阅读:
    没有被实例化的类 中的 非static成员函数竟然也可以被调用。。。前提是该成员函数没有用到成员变量
    c++注意
    关于类大小的小试验
    C语言|博客作业02
    在C#中进行时间和时间戳的转换
    正则表达式中匹配中括号 [ ]
    在C#中将对象序列化成Json格式
    在MSSQL中的简单数据类型递归
    HTML中padding和margin的区别和用法
    C#中的对称加密
  • 原文地址:https://www.cnblogs.com/maxeysblog/p/9733049.html
Copyright © 2020-2023  润新知