Edit report at http://bugs.php.net/bug.php?id=47424&edit=1

 ID:               47424
 Comment by:       whatrevolution at yahoo dot com
 Reported by:      d_kelsey at uk dot ibm dot com
 Summary:          not operator does a C cast to long which is different
                   to other ops
 Status:           Open
 Type:             Bug
 Package:          Scripting Engine problem
 Operating System: Linux 64Bit
 PHP Version:      5.2CVS-2009-02-17 (CVS)

 New Comment:

Bug OP's test, result:



int 9223372036854775807

int 9223372036854775807





PHP Version 5.2.10-2ubuntu6.4



System  Linux 2.6.31-20-generic x86_64

Build Date      Jan 6 2010 22:36:47

Server API      Apache 2.0 Handler 

PHP API         20041225

PHP Extension   20060613

Zend Extension  220060519

Debug Build     no

Thread Safety   disabled

Zend Memory Manager     enabled 



Apache/2.2.12 (Ubuntu)


Previous Comments:
------------------------------------------------------------------------
[2009-02-17 14:05:01] d_kelsey at uk dot ibm dot com

Description:
------------
In zend_operators.c the function ZEND_API int bitwise_not_function(..)

handles a double by doing a c cast to a long

"if (op1->type == IS_DOUBLE) {

        op1->value.lval = (long) op1->value.dval;

        op1->type = IS_LONG;

}"



but all other operators use the zendi_convert_to_long() macro

so not isn't consistent with the other operators.



this can result in an unexpected value as shown in the test case

Reproduce code:
---------------
<?php

define("MAX_64Bit", 9223372036854775807);

$e = (MAX_64Bit + 1);

$f = (int)$e;

var_dump(~(MAX_64Bit + 1));

var_dump(~$f);

?>



Expected result:
----------------
int(-9223372036854775808)

int(-9223372036854775808)

Actual result:
--------------
int(9223372036854775807)

int(-9223372036854775808)




------------------------------------------------------------------------



-- 
Edit this bug report at http://bugs.php.net/bug.php?id=47424&edit=1

Reply via email to