PHP 负数值得问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP 负数值得问题相关的知识,希望对你有一定的参考价值。

举个例子 00000101等于5
但是 11111011 的值为-5 这个-5怎么来的 按照二进制来算应该为200多,最高位我知道1代表负数
00000000 00000000 00000000 00000101 值为5
算法为1*2的0次方+2*2的二次方 值为5

11111111 11111111 11111111 11111011 值为-5
这个算法是怎么算的?

在计算机中,负数以其正值的补码形式表达。
什么叫补码呢?这得从原码,反码说起。
 
原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。
比如 00000000 00000000 00000000 00000101 是 5的 原码。
 
反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。
取反操作指:原为1,得0;原为0,得1。(1变0; 0变1)
比如:将00000000 00000000 00000000 00000101每一位取反,得11111111 11111111 11111111 11111010。
称:11111111 11111111 11111111 11111010 是 00000000 00000000 00000000 00000101 的反码。
反码是相互的,所以也可称:
11111111 11111111 11111111 11111010 和 00000000 00000000 00000000 00000101 互为反码。
 
补码:反码加1称为补码。
也就是说,要得到一个数的补码,先得到反码,然后将反码加上1,所得数称为补码。
比如:00000000 00000000 00000000 00000101 的反码是:11111111 11111111 11111111 11111010。
那么,补码为:
11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011

所以,-5 在计算机中表达为:11111111 11111111 11111111 11111011追问

算法,不是表示方法 大哥!怎么推的我都知道,我要的是1111111 11111111 11111111 11111011为什么算出来为-5,怎么推算出来的

追答

首位是1 ,知道是负数。
1111111 11111111 11111111 11111011 是补码

反码是 1111111 11111111 11111111 11111010 (补码减1)

原码是 0000000 00000000 00000000 00000101 (就是5)

于是这个数就是 -5

参考技术A 负数是其正值的补码。
00000101 5 =》》补码 11111011 方法是 按位取反末位加1

检查字符串是不是为整数(包括负数) PHP

【中文标题】检查字符串是不是为整数(包括负数) PHP【英文标题】:Check to see if string is an integer (includes negative numbers) PHP检查字符串是否为整数(包括负数) PHP 【发布时间】:2013-04-17 18:04:22 【问题描述】:

下面的函数检查字符串是否为整数,这意味着它应该只包含数字。但它不检查数字是否为负(负数也应该返回真,因为它们是整数)。

function validateInteger($value)

   //need is_numeric to avoid $value = true returns true with preg_match
   return is_numeric($value) && preg_match('/^\d+$/', $value);

我进行了测试并得到了结果:

'12.5'      => FALSE 
12.5        => FALSE 
'a125'      => FALSE 
'125a'      => FALSE 
'1a2.5'     => FALSE 
125         => TRUE 
'abc'       => FALSE 
false       => FALSE 
true        => FALSE 
'false'     => FALSE 
'true'      => FALSE 
null        => FALSE 
'null'      => FALSE 
'1231'      => TRUE 
-1231       => FALSE (SHOULD RETURN TRUE)
'-1231'     => FALSE (SHOULD RETURN TRUE)

我不想使用itnval() < 0。我更喜欢正则表达式来检查负数。

谢谢

编辑:

我还有一个函数validateFloat,如果给定的数字是浮点数,则返回true,这意味着它只能包含数字。我还需要对此应用相同的逻辑,以便它为 负浮点数

返回 true

【问题讨论】:

【参考方案1】:

is_int 还不够好?

filter_var($input, FILTER_VALIDATE_INT) 应该具有相同的效果,但也适用于字符串。

【讨论】:

但如果 value 是一个字符串但包含所有数字,则返回 false。在我的情况下,'125' 和 '-1231' 将返回 false filter_var($input, FILTER_VALIDATE_INT) 如果 $input = true 则返回 true。在这种情况下它应该是错误的 @GGio 尝试添加选项FILTER_NULL_ON_FAILURE @GGio 实际上它似乎会被转换为int,所以我认为你只需要做一个明确的检查$input !== true && filter_var(... filter_var( '-010', FILTER_VALIDATE_INT ) 导致误报,而(int)'-010' 返回-10【参考方案2】:

只需使用is_numeric(abs($val))

【讨论】:

@GGio 然后is_numeric($val) && is_numeric(abs($val)) 我的 DownVote:is_numeric( abs( '125a' ) ) 导致误报。

以上是关于PHP 负数值得问题的主要内容,如果未能解决你的问题,请参考以下文章

php 如何将数字 负号去除

如何防止整数值变为负数

文本框只能输入数值,小数点,负数的问题

R语言sign函数判断数值为正数或者负数实战

关于负数

单元测试