标签: numeric-conversion

为什么0 <-0x80000000?

我有一个简单的程序:

#include <stdio.h>

#define INT32_MIN        (-0x80000000)

int main(void) 
{
    long long bal = 0;

    if(bal < INT32_MIN )
    {
        printf("Failed!!!");
    }
    else
    {
        printf("Success!!!");
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

条件if(bal < INT32_MIN )总是如此.这怎么可能?

如果我将宏更改为:

#define INT32_MIN        (-2147483648L)
Run Code Online (Sandbox Code Playgroud)

有谁可以指出这个问题?

c signed numeric-conversion numeric-limits

251
推荐指数
6
解决办法
2万
查看次数

通过转换为uint而不是检查负值来执行范围检查是否更有效?

我在.NET的List源代码中偶然发现了这段代码:

// Following trick can reduce the range check by one
if ((uint) index >= (uint)_size) {
  ThrowHelper.ThrowArgumentOutOfRangeException();
}
Run Code Online (Sandbox Code Playgroud)

显然这比(?)更有效 if (index < 0 || index >= _size)

我很好奇这个技巧背后的理由.单个分支指令真的比两个转换要贵uint吗?或者是否还有一些其他优化会使这个代码比另外的数字比较更快?

为了解决房间里的大象:是的,这是微优化,不,我不打算在我的代码中到处使用它 - 我只是好奇;)

c# performance micro-optimization numeric-conversion range-checking

77
推荐指数
5
解决办法
4439
查看次数

Bash - 测试一个字符串是否比另一个字符串"更大" - 它是如何在内部工作的?

在Bash中,我可以编写以下测试

[[ "f" > "a" ]]
Run Code Online (Sandbox Code Playgroud)

这导致返回0,即为真.bash如何实际执行此字符串比较?从我的理解>做一个整数比较.它是否尝试比较操作数的ASCII值?

bash numeric-conversion

23
推荐指数
2
解决办法
3万
查看次数

C++中用于在数字类型之间进行转换的最佳实践

在不同数字类型之间进行投射的最佳做法是什么?类型float,double,int是+ +我使用C中的大多数人.

选项的一个示例,其中fa floatndouble或者int:

float f = static_cast<float>(n);
float f = float(n);
float f = (float)n;
Run Code Online (Sandbox Code Playgroud)

我经常写,static_cast<T>(...)但想知道如果有一种首选方式,C++开发社区是否有任何共识.

我很欣赏这可能最终成为一个基于意见的问题而且可能没有"标准"的方式,在这种情况下请告诉我没有标准方法,所以至少我知道:-)

我知道这个问题已经出现了相对于一般的铸造,但是,我对数字特别有兴趣和是否有针对数种办法具体的最佳实践.

c++ casting numeric-conversion

11
推荐指数
1
解决办法
7661
查看次数

XSLT将数字比较为字符串

背景

我最近惊讶地注意到XSL能够智能地处理数字; 即在进行比较时知道将文本中的数字视为数字(即它理解7 < 10而不是思考'10' < '7').就我而言,这就是我想要的; 只是不是我所期待的.

出于好奇,我试图强迫XSLT将数字作为字符串进行比较(即通过使用string()函数,但没有运气.

是否有可能让XSLT将数字作为字符串进行比较; 比如这样'10' < '7'

源XML:

<?xml version="1.0" encoding="utf-8"?>
<element>
  <x>1</x>
  <x>2</x>
  <x>3</x>
  <x>4</x>
  <x>5</x>
  <x>6</x>
  <x>7</x>
  <x>8</x>
  <x>9</x>
  <x>10</x>
</element>
Run Code Online (Sandbox Code Playgroud)

XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output indent="yes"/>
  <xsl:template match="element">
    <element>

      <AsItComes>
        <xsl:for-each select="./x">
          <xsl:if test="./text() &lt; 7">
            <xsl:copy-of select="."></xsl:copy-of>
          </xsl:if>
        </xsl:for-each>
      </AsItComes>

      <AsNumber>
      <xsl:for-each select="./x">
        <xsl:if test="number(./text()) &lt; 7">
          <xsl:copy-of select="."></xsl:copy-of>
        </xsl:if>
      </xsl:for-each>
      </AsNumber>

      <AsString>
        <xsl:for-each select="./x">
          <xsl:if test="string(./text()) …
Run Code Online (Sandbox Code Playgroud)

xslt comparison string-comparison numeric-conversion

7
推荐指数
1
解决办法
4712
查看次数

SQL Server CONVERT(NUMERIC(18,0),'')失败,但CONVERT(INT,'')成功了吗?

PRINT CONVERT(NUMERIC(18,0), '')

产生 Error converting data type varchar to numeric.

然而,

PRINT CONVERT(INT, '')

产生 0没有错误......

问题:是否有一些SQL Server标志或我是否需要为每个varchar到数字转换执行case语句?(除了明显的原因?)

sql sql-server numeric-conversion

5
推荐指数
1
解决办法
7万
查看次数

C ++如何为浮点数设置固定的十进制精度

我有一个API调用,它返回一个double。双精度数的十进制长度可以从很多小数位到几个小数位不等(全部归结为执行器的状态)。此双精度表示执行器范围半径上的当前位置。我对这样的详细数字不感兴趣,因为它会给系统增加很多噪音。我一直在使用浮点数来节省空间,但仍然有6-8十进制长度的浮点数。我对地板或天花板不感兴趣,只是因为它不能完成我想要的工作。例如,我有数字:

-2.05176
-0.104545
 0.30643
 0.140237
 1.41205
-0.176715
 0.559462
 0.364928
Run Code Online (Sandbox Code Playgroud)

无论如何,我都希望将精度设置为2个小数位。我不是在谈论std :: cout的输出精度,我知道如何设置它。我说的是浮子的实际精度。即:我对浮点数感兴趣,这些浮点数将具有0.XX格式和0.XX00000000000的实际精度。因此,将上面的列表转换为:

-2.05
-0.10
 0.30
 0.14
 1.41
-0.17
 0.55
 0.36
Run Code Online (Sandbox Code Playgroud)

我知道boost有一个数值转换模板,但是我不知道如何使用较低的精度从float转换为float。有人可以帮忙吗?

c++ boost rounding numeric-conversion

3
推荐指数
1
解决办法
5212
查看次数

可以使用按位运算符将4个无尾符号整数的小端序列字节分配给Java原语吗?

我想读取4个字节,它是无符号32位整数的小端编码,并将值赋给Java int

(是的,实际上我会使用'long',但在这种情况下我知道'无符号值永远不会那么大,它会以二进制补码表示法溢出一个带符号的int,并且它适合我的插图使用一个int ).

有问题的4个字节编码值'216'little-endian样式:

0xD8000000
Run Code Online (Sandbox Code Playgroud)

基本上我只需要将以下位模式填充到Java int中:

0x000000D8
Run Code Online (Sandbox Code Playgroud)

下面的简单代码应该这样做......对于前三个'0x00'字节,它成功:

byte b1 = din.readByte();
byte b2 = din.readByte();
byte b3 = din.readByte();
byte b4 = din.readByte();
int s = 0;
s = s | b4;
s = (s << 8);
s = s | b3;
s = (s << 8);
s = s | b2;
s = (s << 8);
s = s | b1;
return s;
Run Code Online (Sandbox Code Playgroud)

然而,它搞砸了:

s = s | b1;
Run Code Online (Sandbox Code Playgroud)

...因为b1的位是1101 1000,这是二进制补码表示法中的负数(-40),因为最高有效位是1.当Java在按位或运算符进行求值之前将b1扩展为int. ,-40编码为0xFFFFFFD8,这使我们天真的假设,即加宽int的前3个字节将为0.

所以我的策略搁浅了.但我该怎么做呢?甚至可以使用原始运算符解决这个问题(请给出解决方案),还是我们必须求助于类库?(我不会在我的正常编码中直接使用位和字节,所以我缺乏成语似乎应该是'每天'代码).

对于类库方法,以下片段得到了正确的结果:

ByteBuffer b …
Run Code Online (Sandbox Code Playgroud)

java endianness bitwise-operators numeric-conversion

1
推荐指数
1
解决办法
1520
查看次数

Casting和Convert.ToInt32()在C#中表现不同?

这是一段简单的C#代码:

Convert.ToInt32(TimeSpan.FromMinutes(5).TotalMilliseconds);
//which brings me 300000

(int)TimeSpan.FromMinutes(5).Milliseconds;
//which brings me 0
Run Code Online (Sandbox Code Playgroud)

(int)Convert.ToInt32()?相比,为什么投射结果会有所不同?

两者都不应该带来相同的结果吗?

c# casting type-conversion numeric-conversion

0
推荐指数
1
解决办法
203
查看次数