
原理
Free Jim
这个作者很懒,什么都没留下…
展开
-
hosts文件
可以通过修改hosts文件自定域名解析服务器–可以顺利访问steam127.0.0.1 steamcommunity.com #S302127.0.0.1 www.steamcommunity.com #S302127.0.0.1 store.steampowered.com #S302127.0.0.1 api.steampowered.com #S302127.0.0.1 s...原创 2020-03-21 23:00:03 · 621 阅读 · 0 评论 -
Stack around the variable was corrupted
意思是说,变量周围的栈被破坏了如果,程序对所申请内存以外的区域进行修改,则会报错(如:数组越界访问)原创 2020-01-11 19:20:50 · 1363 阅读 · 0 评论 -
最高有效字节
最高有效位:对带符号数来说就是符号位,对无符号数来说就是首位举例:-1的机器码——1111…1则最高有效位就是最左边的1最高有效字节:同理,只是把 “ 位 ” 换成了 “ 字节 ”一个字节等于8位举例:-1的机器码是——1111…1最高有效字节,即最左边的8个1—— FF留个习题帮助理解...原创 2020-01-11 16:30:45 · 6195 阅读 · 1 评论 -
移码
对补码符号位取反但是,这个说法并不准确与其说是符号位取反,倒不如说是最高位加1大家都知道,移码是用在阶码上的拿 float 单精度来举例:八位的阶码,偏置常数是2^(n-1) - 1 = 127 (至于为什么是127而不是128,可参考浮点数的偏置常数)如果指数是2 —— 0000 0010(二进制)则阶码应该存127 + 2 =129 ——1000 0010(二进制)然后,按我们...原创 2020-01-07 20:51:45 · 7991 阅读 · 5 评论 -
浮点数的溢出
核心:浮点数的溢出与整数的溢出是不一样的\color{red}{浮点数的溢出与整数的溢出是不一样的}浮点数的溢出与整数的溢出是不一样的上溢出:数值增大,直到阶码全为1,然后尾数全为0,表示无穷,如果要 print 输出的话,会输出 INF —— infinity 无穷#include <iostream>using namespace std;void main(){ ...原创 2020-01-06 11:11:00 · 8935 阅读 · 0 评论 -
浮点数尾数规格化
核心:通过阶码的减1加1,然后尾数的左移或右移来规格化\color{red}{通过阶码的减1加1,然后尾数的左移或右移来规格化}通过阶码的减1加1,然后尾数的左移或右移来规格化承接尾数进行运算后:浮点数位数运算要把对阶前变化的浮点数,变回去对阶前:0.75 —— 0 01111110 10…0对阶后:0.75 ——0 10000101 0000001100…0 (多出来的一个1是隐藏...原创 2020-01-06 10:32:14 · 15247 阅读 · 0 评论 -
缓冲区溢出攻击
核心:通过数组越界,更改函数的返回地址,进而使得程序跳转到黑客指定地址,执行恶意程序\color{red}{通过数组越界,更改函数的返回地址,进而使得程序跳转到黑客指定地址,执行恶意程序}通过数组越界,更改函数的返回地址,进而使得程序跳转到黑客指定地址,执行恶意程序如果了解函数调用时的栈帧结构的话,这很容易理解如果完全不懂的可以参考这篇文章:函数调用过程这里再解释一下,数组越界修改返回地址...原创 2020-01-05 20:01:50 · 194 阅读 · 0 评论 -
计算机系统基础习题
若机器 M1 和 M2 具有相同的指令集,其时钟频率分别为 1GHz 和 1.5GHz。在指令集中有五种不同类型的指令 A~E。下表给出了在 M1 和 M2 上每类指令的平均时钟周期数 CPI。机器 A B C D EM1 1 2 2 3 4M2 2 2 4 5 6请回答下列问题:(1)M1 和 M2 的峰值 MIPS 各是多少?(2)假定某程序 P 的指令序列中,五类指令具有完全...原创 2020-01-04 11:38:47 · 4697 阅读 · 0 评论 -
浮点数加减法
核心:\color{red}{核心:}核心:对阶,原码运算\color{red}{对阶,原码运算}对阶,原码运算对阶后的舍入\color{green}{对阶后的舍入}对阶后的舍入浮点数的底数是原码表示的\color{green}{浮点数的底数是原码表示的}浮点数的底数是原码表示的...原创 2020-01-04 11:14:19 · 509 阅读 · 0 评论 -
浮点数尾数运算
核心:\color{red}{核心:}核心:补码运算,补码原码的转换\color{red}{ 补码运算,补码原码的转换}补码运算,补码原码的转换举例:(单精度32位 float)0.75 + ( - 65.25 ) = -64.50.75 —— 0 01111110 10…0-65.25——1 10000101 000001010…0对阶之后:(可以参考这篇文章:浮点数对阶)0.75...原创 2020-01-04 11:11:31 · 10929 阅读 · 2 评论 -
浮点数对阶
核心:\color{red}{核心:}核心:阶码的补码运算\color{red}{阶码的补码运算}阶码的补码运算举例:1.5 x 10^3 和 1.25 x 10^5小阶向大阶\color{green}{小阶向大阶}小阶向大阶则有 0.015 x 10^5 和 1.25 x 10^5但这是我们人站在十进制的角度来进行的计算机的处理方式与我们人的处理方式不同\color{green}{...原创 2020-01-03 20:05:02 · 15760 阅读 · 3 评论 -
浮点数的舍入
核心:\color{red}{核心:}核心:四种舍入原则,看哪种与有附加位的结果最接近,就选取哪种\color{red}{四种舍入原则,看哪种与有附加位的结果最接近,就选取哪种}四种舍入原则,看哪种与有附加位的结果最接近,就选取哪种四种舍入原则:就近舍入到偶数朝+∞方向舍入:在最后一位+1朝-∞方向舍入:在最后一位+1(浮点数的符号由符号位决定,底数是原码)朝0的方向舍入:正数-1,...原创 2020-01-03 19:38:32 · 6037 阅读 · 2 评论 -
OF CF 标志位的判定
OF:最高位进位⊕次高位进位(对带符号数才有意义)最高位进位:进位出去(溢出去)\color {green}{最高位进位:进位出去(溢出去)}最高位进位:进位出去(溢出去)次高位进位:进位到最高位(对带符号数来说即符号位)\color {green}{次高位进位:进位到最高位(对带符号数来说即符号位)}次高位进位:进位到最高位(对带符号数来说即符号位)CF: sub⊕C(⊕为异或,CF对无符...原创 2019-12-27 10:54:20 · 19277 阅读 · 11 评论 -
函数调用过程
pushl %ebpmovl %esp, %ebpsubl $16, %esp这个是函数调用的必经步骤!看懂这个之前还得先了解计算机的堆栈结构一:计算机一般是小端——储存顺序和常识相反(仅供理解)即 高地址(栈底)—————— 低地址(栈顶)ebp 和 esp 是两个寄存器,分别保存栈底指针和栈顶指针(地址)二:栈——相当于往有底的杯子里倒水那么,上面的汇编语句就可以...原创 2019-12-17 00:37:11 · 3060 阅读 · 0 评论 -
精度截断的原理
精度截断是由寄存器的位数一定实现的举个例子:int 转 short 就可能会发生截断——截断时只保留低 16 位(short 为2字节)即把32位的数往16位的寄存器里存,所谓截断,所谓精度丢失...原创 2019-12-16 23:00:41 · 602 阅读 · 0 评论 -
浮点数的舍入和误差问题
#include <iostream>using namespace std;void main(){ float a; double b; a=123456.789e4; b=123456.789e4; printf("%f\n",a); printf("%lf",b);}执行结果:1234567936.0000001234...原创 2019-12-01 00:02:07 · 2836 阅读 · 1 评论 -
int与short的赋值的坑
#include <iostream>using namespace std;void main(){ int a=0x7fff0001; short b; b=a; cout<<"a="<<a<<endl; cout<<"b="<<b<<endl;}运行结果:a=...原创 2019-11-30 23:10:29 · 4952 阅读 · 0 评论 -
float精度不够的情况
#include <iostream>using namespace std;void main(){ float a=2147483647; printf("%f",a);}运行结果:2147483648.000000请按任意键继续. . .可以看到结果由…47变成了…48 ,原因是float的精度不够来看看该 float 变量在内存中的储存机器码:...原创 2019-11-30 22:47:46 · 1375 阅读 · 0 评论 -
浮点数阶码表示范围
这里拿float举例float 的阶码位有8位,偏置常数为127按道理说应该是2^8 -1=256 -1=255减去偏置常数128~-127但是,因为浮点数有一些特殊表示当阶码全为1时(阶码:255 -127=128),用于表示非数NaN或无穷这是特殊情况所以,对规格化数来说,也就是一般情况来说阶码的范围为127 ~ -127这也是偏置常数设置成127的原因——保证正负对称...原创 2019-11-16 10:20:49 · 12997 阅读 · 4 评论 -
warning C4146: 一元负运算符应用于无符号类型,结果仍为无符号类型
这种警告出现在变量表示范围的临界状态一: 溢出问题int main(){ int a=-2147483648; return 0; }在已经定义死int型的情况下,影响不大,但是下面的例子却会由很大的影响二:类型转化int main(){ if(2147483647==-214748...原创 2019-11-16 09:57:37 · 1371 阅读 · 0 评论 -
C语言整数比较语句的原理
int a=1;int b=2;if(a>b)以上比较语句的运行机制——做减法即根据整数a-b的结果来看a和b谁大这里所谓的“ 结果 ”并不是看减出来的差是大于0还是小于0而是根据CPU中加法器的特定的标志位Ps:减法运算在一定条件下可以转化成加法,用加法器进行运算ZF:机器码全为0置1,反之置0——(零标志位)SF:机器码最高位CF:对无符号数起作用,CF=sub⊕C...原创 2019-11-16 09:43:53 · 1510 阅读 · 0 评论 -
位运算处理2的n次方的除法
假设X为一个int型变量,请给出一个用来计算x/32的值的函数div32.要求不能使用除法、乘法、模运算、比较运算、循环语句和条件语句。可以使用右移、加法以及按位运算。#include<iostream>using namespace std;void div32(int n){ int x=(n>>31)&0x1F; //偏置常数 ...原创 2019-11-11 12:37:23 · 2984 阅读 · 0 评论 -
C语言 int 临界值的一些情况
#include<iostream>using namespace std;int main(){ int a=2147483647; unsigned int d=2747483647; unsigned int e=2147483648; //if(a>b)cout<<1<<endl; //不优化 if(...原创 2019-11-11 11:52:19 · 1080 阅读 · 0 评论 -
非数NaN会有自己不等于自己的情况
#include<iostream>using namespace std;int main(){ float a = sqrt(2); float b = sqrt(-2); a==a?cout << "real number" << std::endl: cout << "nan number" ...原创 2019-10-27 19:41:13 · 245 阅读 · 0 评论 -
十六进制赋值
之前学习浮点数,有一些特殊的值比如说 正无穷大——符号位为0 阶码全为1 位数全为0然后,我想看无穷大输出是什么样的,就做了这么个操作#include <iostream>using namespace std;int main(){ float b=0x7f800000;//转化成二进制 0 11111111 00...0 想表示无穷大 cout<&...原创 2019-10-26 13:43:32 · 2104 阅读 · 0 评论 -
喜欢捣蛋的无符号类型
#include <iostream>using namespace std;int main(){ unsigned int a=-1; int b=2; if(a>b)cout<<"为什么-1>2?"<<endl; else cout<<"-1<2"<<endl; ret...原创 2019-10-26 13:27:55 · 203 阅读 · 0 评论 -
浮点数的偏置常数
偏置常数,帮助增大浮点数的精度拿 float 举例float 的阶码有八位表示范围 0~255 正数足以给浮点数表示足够大的数但是,想精确小数点后的数字却仍有不足所以这里设置一个偏执常数2^(n-1) - 1 =2^7 -1 =127来让 float 阶码部分的表示范围变成-127~128当阶码为负数时,相当于小数点往左边移动,让小数部分的位数增加了综上:偏执常数的设置,是为...原创 2019-10-26 13:01:01 · 9329 阅读 · 0 评论 -
计算机内加减法的溢出处理
往正数方向溢出了,则减去2^n往负数方向或0方向溢出了,则加上2^nn为数据类型的位数char——1字节,8位 2^n=256举例子:#include <iostream>using namespace std;int main(){ char a=127; printf("%d\n",a); a++; printf("%d\n",a);...原创 2019-10-26 12:47:29 · 4833 阅读 · 0 评论 -
计算机内减法的运算
减法的运算法则:进行取补码的操作,然后相加(一)无符号 int 减法unsigned int a=4;unsigned int b=3;unsigned int c=a-b;a减b相当于a加b的补码b:0000 0000 0000 0000 0000 0000 0000 0011减法,b取补码:1111 1111 1111 1111 1111 1111 1111 1101a:0...原创 2019-10-26 12:32:56 · 4039 阅读 · 0 评论 -
浮点数的一些特殊数值
1.+0 和 -0阶码全位0尾数全为0,正负由符号位决定2.+∞和-∞阶码全为1,尾数全为0,正负由符号位决定3.非规格化数阶码全为0,尾数非0顺带解释,为什么要有非规格化数大家知道浮点数是有隐藏位“ 1 ”的然后,浮点数的计算会有1. XXX * 2^n那怎么表示0呢???这里就需要有非规格化数了因为阶码全为0的非规格化数的隐藏位是“ 0 ”,这时就可以处理 0 的问题了!...原创 2019-10-24 11:07:55 · 10603 阅读 · 8 评论 -
VS2012 查看变量在内存中储存的数据
步骤依次如下:设置断点——进入调试状态——点击上方调试选项卡——窗口——内存——内存1Ps:一定要进入调试状态才可以哦!然后,在下方就会有内存的窗口了!最左边的是内存地址 右边是对应的内容那么如何查看具体变量在哪块内存呢?取地址啦~如下图:在搜索栏用&取a的地址,然后回车就可以啦!(搜索栏是可以识别表达式的)赋值操作完成后,对应地址的值就变化了哦!另外再提,内存中...原创 2019-10-22 13:13:26 · 1897 阅读 · 1 评论 -
c语言 int的最大值——机器码
C语言中 int为4字节,32bit其机器码第一位为符号位,余下31位表示数字表示范围:-2^31 (-2147483648) ~ 2^31-1 (2147483647)下面来看一下:最大值2147483647(机器码: 0111…1)再加一就变成了最小的整数-2147483648(100…0)——特殊值,记住就行了如果再加一则为100…1,减一取反后为111…1即为-2147483...原创 2019-10-01 10:14:11 · 8190 阅读 · 0 评论 -
结构体的内存分配
首先来看一段代码:#include<iostream>using namespace std;struct man{ double b; // 8 char a; // 1 int c; // 4};int main(){ man A; cout<<sizeof(A)<<endl; cout...原创 2019-07-11 13:09:08 · 2089 阅读 · 0 评论 -
二进制小数
怎么用二进制表示小数呢?这里其实很妙~~以往我们二进制转十进制是这样的:(二进制) 111=1* 2^2 + 1 * 2^1 + 1 * 2^0 = 7(十进制)通常2的幂是大于或等于0 的,那么2的幂小于零会是怎么样呢?试试看:1* 2^-1+1* 2^-2 =0.75神奇地出现了小数!!我们可以这样表示: 0.75转化成二进制就是0.11, 也就是说个位数,2的0次幂并不是终点...原创 2019-07-02 15:30:16 · 8750 阅读 · 2 评论 -
浮点数详解
所谓“浮点”是什么意思呢?计算机能处理二进制的数,那么小数是怎么处理的呢?下面一起来看看 ~~“浮点”的“点”指的是小数点,而“浮”指的是小数点的移动小数的处理其实类似于科学计数法拿 float 举例:float 占4个字节,每个字节为8位(bit),每个位(bit)占一个0或1,总共有32位第1个位是符号位,0表示正,1表示负之后的8个位是指数位(表示要移动的位数),2的8次方为 ...原创 2019-07-02 14:53:36 · 13991 阅读 · 3 评论