我有一个简单的程序:
#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)
有谁可以指出这个问题?
// 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
在Bash中,我可以编写以下测试
[[ "f" > "a" ]]
Run Code Online (Sandbox Code Playgroud)
这导致返回0,即为真.bash如何实际执行此字符串比较?从我的理解>做一个整数比较.它是否尝试比较操作数的ASCII值?
在不同数字类型之间进行投射的最佳做法是什么?类型float,double,int是+ +我使用C中的大多数人.
选项的一个示例,其中fa float和n是double或者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++开发社区是否有任何共识.
我很欣赏这可能最终成为一个基于意见的问题而且可能没有"标准"的方式,在这种情况下请告诉我没有标准方法,所以至少我知道:-)
我知道这个问题已经出现了相对于一般的铸造,但是,我对数字特别有兴趣和是否有针对数种办法具体的最佳实践.
背景
我最近惊讶地注意到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() < 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()) < 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) PRINT CONVERT(NUMERIC(18,0), '')
产生 Error converting data type varchar to numeric.
然而,
PRINT CONVERT(INT, '')
产生 0没有错误......
问题:是否有一些SQL Server标志或我是否需要为每个varchar到数字转换执行case语句?(除了明显的原因?)
我有一个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。有人可以帮忙吗?
我想读取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) 这是一段简单的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# ×2
c++ ×2
casting ×2
bash ×1
boost ×1
c ×1
comparison ×1
endianness ×1
java ×1
performance ×1
rounding ×1
signed ×1
sql ×1
sql-server ×1
xslt ×1