作者:风影残烛

在还原代码的过程中。目前程序是采用VS2005(以上版本)写的。

我使用的是vc6.0,结果。在运算的时候。发现编译器对

// FpuTlxTest.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <string.h>
#include <math.h>
#include <stdlib.h> void KeyFun(char* pComputerName)
{
char szKey[16] = {0};
int iNum_ebx = 0;
int iNum_ecx = 0;
int iNum_var30 = 0;
int dwCptNameLen = strlen(pComputerName);
if (dwCptNameLen != 0)
{
int i = 1;
int iTempMod;
if (dwCptNameLen >= i)
{
double dblNum = 0.0;
char* pTial = &pComputerName[dwCptNameLen - 1];
int iNum = 2;
iNum = 2 - (int)pComputerName;
for (; i <= dwCptNameLen; i++, pTial--)
{
int iCharacter = (int)pComputerName[i-1];
double dblTemp = sqrt((double)iCharacter) * i + 1.0;
iCharacter = iCharacter * i * i;
iTempMod = (int)(dblTemp * (double)iCharacter + dblNum) % 100000;
iCharacter = iTempMod;
dblNum = (double)iCharacter;
iCharacter = (int)*pTial;
dblTemp = pow(sqrt((double)iCharacter), 2) * dblNum;
iCharacter = iNum + (int)&pComputerName[i-1];
int iTemp = (int)(dblTemp * (double)iCharacter) % 100000;
iNum_ebx = iNum_ebx + iTemp + 1;
iCharacter = iNum_ebx * iTempMod;
iTemp = iCharacter;
iCharacter = iNum_var30 - (iNum_var30 / 100000 * 100000);
iNum_var30 = (int)(sqrt((double)iTemp) + (double)iCharacter); // 这里会有浮点溢出的情况
}
iNum_ecx = iNum_var30;
}
int iSaveNum = iTempMod + 0x1f;
iSaveNum &= 0x8000007F;
if ( iSaveNum < 0)
{
iSaveNum--;
iSaveNum |= 0xFFFFFF80;
iSaveNum++;
}
szKey[0] = (char)iSaveNum;
iSaveNum = iTempMod + 0x20;
iSaveNum &= 0x8000007F;
if (iSaveNum < 0)
{
iSaveNum--;
iSaveNum |= 0xFFFFFF80;
iSaveNum++;
}
szKey[1] = (char)iSaveNum;
iSaveNum = iTempMod + 0x27;
iSaveNum &= 0x8000007F;
if (iSaveNum < 0)
{
iSaveNum--;
iSaveNum |= 0xFFFFFF80;
iSaveNum++;
}
szKey[2] = (char)iSaveNum;
iSaveNum = iTempMod + 0x3a;
iSaveNum &= 0x8000007F;
if (iSaveNum < 0)
{
iSaveNum--;
iSaveNum |= 0xFFFFFF80;
iSaveNum++;
}
szKey[3] = (char)iSaveNum;
iSaveNum = iTempMod + 0x5f;
iSaveNum &= 0x8000007F;
if (iSaveNum < 0)
{
iSaveNum--;
iSaveNum |= 0xFFFFFF80;
iSaveNum++;
}
szKey[4] = (char)iSaveNum;
iSaveNum = iNum_ebx + 0x9c;
iSaveNum &= 0x8000007F;
if (iSaveNum < 0)
{
iSaveNum--;
iSaveNum |= 0xFFFFFF80;
iSaveNum++;
}
szKey[5] = (char)iSaveNum;
iSaveNum = iNum_ebx + 0xf7;
iSaveNum &= 0x8000007F;
if (iSaveNum < 0)
{
iSaveNum--;
iSaveNum |= 0xFFFFFF80;
iSaveNum++;
}
szKey[6] = (char)iSaveNum;
iSaveNum = iNum_ebx + 0x176;
iSaveNum &= 0x8000007F;
if (iSaveNum < 0)
{
iSaveNum--;
iSaveNum |= 0xFFFFFF80;
iSaveNum++;
}
szKey[7] = (char)iSaveNum;
iSaveNum = iNum_ebx + 0x21f;
iSaveNum &= 0x8000007F;
if (iSaveNum < 0)
{
iSaveNum--;
iSaveNum |= 0xFFFFFF80;
iSaveNum++;
}
szKey[8] = (char)iSaveNum;
iSaveNum = iNum_ebx + 0x2f8;
iSaveNum &= 0x8000007F;
if (iSaveNum < 0)
{
iSaveNum--;
iSaveNum |= 0xFFFFFF80;
iSaveNum++;
}
szKey[9] = (char)iSaveNum;
iSaveNum = iNum_ecx + 0x407;
iSaveNum &= 0x8000007F;
if (iSaveNum < 0)
{
iSaveNum--;
iSaveNum |= 0xFFFFFF80;
iSaveNum++;
}
szKey[10] = (char)iSaveNum;
iSaveNum = iNum_ecx + 0x552;
iSaveNum &= 0x8000007F;
if (iSaveNum < 0)
{
iSaveNum--;
iSaveNum |= 0xFFFFFF80;
iSaveNum++;
}
szKey[11] = (char)iSaveNum;
iSaveNum = iNum_ecx + 0x6df;
iSaveNum &= 0x8000007F;
if (iSaveNum < 0)
{
iSaveNum--;
iSaveNum |= 0xFFFFFF80;
iSaveNum++;
}
szKey[12] = (char)iSaveNum;
iSaveNum = iNum_ecx + 0x8b4;
iSaveNum &= 0x8000007F;
if (iSaveNum < 0)
{
iSaveNum--;
iSaveNum |= 0xFFFFFF80;
iSaveNum++;
}
szKey[13] = (char)iSaveNum;
iNum_ecx += 0xad7;
iNum_ecx &= 0x8000007F;
if (iNum_ecx < 0)
{
iNum_ecx--;
iNum_ecx |= 0xFFFFFF80;
iNum_ecx++;
}
szKey[14] = (char)iNum_ecx;
szKey[15] = '\0';
int j = 0;
int k = 0;
while (k < 0x69)
{
char ch = szKey[j];
if (ch >= '0' && ch <= '9')
{
k = k + 7;
j++;
}
else if (ch >= 'A' && ch <= 'Z')
{
k = k + 7;
j++;
}
else if (ch >= 'a' && ch <= 'z')
{
k = k + 7;
j++;
}
else
{
int iTemp = ch + k + 0x1f;
iTemp = iTemp & 0x8000007F;
if (iTemp < 0)
{
iTemp--;
iTemp |= 0xFFFFFF80;
iTemp++;
}
szKey[j] = (char)iTemp;
}
}
}
printf("%s\r\n", szKey);
} int _tmain(int argc, _TCHAR* argv[])
{
KeyFun("TEN-OLOIZ"); system("pause");
return 0;
}

代码中标注的地方 。采用不同的对待方式。导致结果不一样。

vc6.0中测试:如果溢出。则放到edx、eax返回为__int64。然而代码中的为int,所以只取低32字节。

vs2005中测试:如果溢出。则正确返回。

区别在于取整库函数的是实现不一样。有兴趣的朋友可以自己跟进去看。

VC和VS系列(2005)编译器对双精度浮点溢出的处理的更多相关文章

  1. 手写 Vue2 系列 之 编译器

    前言 接下来就要正式进入手写 Vue2 系列了.这里不会从零开始,会基于 lyn-vue 直接进行升级,所以如果你没有阅读过 手写 Vue 系列 之 Vue1.x,请先从这篇文章开始,按照顺序进行学习 ...

  2. VC一些经验系列:《平均绘画矩形图,双击全屏》

    1.RGB宏报错 RGB宏是这样的, #define RGB(r,g,b)          ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))| ...

  3. windows下VC界面 DIY系列1----写给想要写界面的C++程序猿的话

    非常早就想写关于C++ UI开发的一系列博文,博客专栏刚审核通过,就立即開始刷博文,不能辜负自己的一番热血,我并非写界面的高手,仅仅想通过写博文提高我自己的技术积累,也顺便帮助大家解决界面开发的瓶颈. ...

  4. VC一些经验系列: 《分享泄漏检测工具:内存、DC、GDI、Handle... 》

    分享下自己工作中用到的一些用于泄漏检测的工具 后面的是DC的一些定义和注意事项.(不喜勿看) //=================================================== ...

  5. jvm系列 (一) ---jvm内存区域与溢出

    jvm内存区域与溢出 目录 jvm系列(一):jvm内存区域与溢出 jvm系列(二):垃圾收集器与内存分配策略 为什么学习jvm 木板原理,最短的一块板决定一个水的深度,当一个系统垃圾收集成为瓶颈的时 ...

  6. program files (x86)\microsoft visual studio 14.0\vc\include\xtree,如果没有找到,下标溢出了,就报错咯

    ---------------------------Microsoft Visual C++ Runtime Library---------------------------Debug Asse ...

  7. golang输出双精度浮点例子(Printf)

    1 package main import "fmt" func main() { var sum int = 17 var count int = 5 var mean floa ...

  8. flutter系列之:永远不用担心组件溢出的Wrap

    目录 简介 Row和Column的困境 Wrap组件详解 总结 简介 我们在flutter中使用能够包含多个child的widget的时候,经常会遇到超出边界范围的情况,尤其是在Column和Row的 ...

  9. VC 宏与预处理使用方法总结

    目录(?) C/C++ 预定义宏^ C/C++ 预定义宏用途:诊断与调试输出^ CRT 和 C 标准库中的宏^ NULL 空指针^ limits.h 整数类型常量^ float.h 浮点类型常量^ m ...

随机推荐

  1. 剑指 offer set 8 树的子结构

    总结 1. 解法分为两步, 一是定位树的头结点, 二是两棵树作比较 2. 两个数作比较, 包括比较两棵树是否相等, 或者两个数是否镜像, 算法的框架类似 bool comp(root1, root2)

  2. because it is not a variable 编译错误解决方案

    1,将Stuct换为class 2,使用中间变量, 如Point p=new Point(x,y); this.Location=p; 而不能直接给struct赋值,因为值类型是不能改变的,必须生成新 ...

  3. Trace、Debug和TraceSource的使用以及日志设计 .

    [-] Trace 和 Debug区别 什么是Listeners 跟踪开关 使用BooleanSwitch开关 使用TraceSwitch开关 使用TraceSource代替Trace和Debug 设 ...

  4. [设计模式3]--工厂(Factory)模式

    原文出处:http://blog.csdn.net/lwbeyond/article/details/7528309 工厂模式属于创建型模式,大致可以分为三类,简单工厂模式.工厂方法模式.抽象工厂模式 ...

  5. UNIX/Linux网络编程基础:应用层协议简介

    目录 1.HTTP协议 2.FTP协议 3.TELNET协议 4.NFS协议 1.HTTP协议 应用层协议HTTP协议是Web的核心.HTTP协议在Web的客户程序和服务器程序中得以实现,运行在不同系 ...

  6. 使用SQL*PLUS,构建完美excel或html输出

    通过SQL*PLUS我们可以构建友好的输出,满足多样化用户需求.本例通过简单示例,介绍通过sql*plus输出xls,html两种格式文件.首先创建两个脚本:1.main.sql用以设置环境,调用具体 ...

  7. GCC 嵌入汇编代码

    The format of basic inline assembly is very much straight forward. Its basic form is 基本汇编嵌入格式如下: asm ...

  8. 关于解决android4.0系统中菜单无法添加Icon的问题

    在Android4.0系统中,创建菜单Menu,然后通过setIcon方法给菜单添加图标是无效的,图标不会显出来,而之前的系统中是可以显示出来的.这个问题的根本原因在于4.0系统中,涉及到菜单的源码类 ...

  9. 1.6.4 Uploading Structured Data Store Data with the Data Import Handler

    1.使用DIH上传结构化数据 许多搜索应用索引结构化数据,如关系型数据库.DIH提供了一个这样的存储并索引结构化数据的机制.除了关系型数据库,solr可以索引来自HTTP的内容,基于数据源如RSS和A ...

  10. Java基础知识强化之IO流笔记76:NIO之 Channel(通道)之间的数据传输

    1. 在Java NIO中,如果两个通道中有一个是FileChannel,那你可以直接将数据从一个channel(译者注:channel中文常译作通道)传输到另外一个channel. (1)trans ...