能力值:
( LV2,RANK:10 )
|
-
-
2 楼
呃.. 期待答案,我也想知道.
|
能力值:
(RANK:260 )
|
-
-
3 楼
试试10000000L × 600
我没做过内核开发,不太清楚LargeInteger是多少位的,所以不知道对不对。
你试过了要告诉我啊。
当然,我现在要查一查相关的资料。如果有新发现,也会发上来的。
|
能力值:
(RANK:260 )
|
-
-
4 楼
我查了一下MSDN,union LARGE_INTEGER 是64位整形,在VC60中可以这样写。
LARGE_INTEGER l;
// initialize, do something
if ( l.QuadPart < 10000000I64 * 600 )
{
// do something .
}
这样就不会有错误了。注意是大写字母I加上数字64.
不过我没做过驱动开发,手头也没有WDK,不知道内核中LARGE_INTEGER是不是64位,也不知道WDK用的编译器如何表示64位整型的常量。你试一下,试过了记得告诉我啊。
|
能力值:
( LV11,RANK:188 )
|
-
-
5 楼
l.QuadPart/10000000 <600
PS:我是来追看雪第一美女的
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
多谢,多谢,加上I64可以,但是这种方法的原理是什么?能讲讲吗?
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
l.QuadPart/10000000 <600也行,都怪自己计算机原理的数的基本知识没学好啊
|
能力值:
(RANK:260 )
|
-
-
8 楼
加上I64,表明 10000000这个常量是64位整型,这样编译器就会按64位值对待它。
如果字面值常量不回来后缀,将使用默认后缀,整数常量默认为int,小数常量默认为double,等等,这是语言本身规定的。但后缀在不同的编译器可能不同,比如VC6和GCC
如果你不加后缀I64,编译器将按一个int型(32位,在32位平台来说)来求常量表达式的值,而10000000 * 600 这个值超过了32位整数的表示范围,发生了溢出。
在用户态下,这被当作一条警告,而在核心态下,可能要求更严格,当作错误。
另外,l.QuadPart/10000000 <600 这种写法也正确,其实就是非常简单的数学上的等价变换,把右边的10000000除到左边。这样就不会超出整数的表示范围了。
不过这会给编译结果多引入一个除法运算,因为左边的除法运算符的操作数之一是变量,而不是常量。
如果用I64这种做法,乘法运算符是在两个常量之间,因此乘法运算是在编译时刻求值,只相当于一个常量,所以编译的结果中只有比较,没有乘(除)法。
我不是叫真,因为这点效率不算什么,两种都正确。
我只是想说要弄清楚原因。
另外,说点题外的,这是C/C++的一个初级问题,楼主最好到C++社区去寻找答案。
虽然这里的人对这样的问题完全有能力解答,但看雪是以逆向技术为主的技术论坛,这是技术特色。
到C++社区多看看,对编程技术的提高有很大的帮助。
推荐USENET的comp.lang.c++新闻组,以及microsoft.public.vc和microsoft.public.windows,绝对会有帮助。
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
终于看到有人开始重视我了..
好感动..
|
|
|