Language agnostic 什么时候使用无符号值而不是有符号值?

Language agnostic 什么时候使用无符号值而不是有符号值?,language-agnostic,types,Language Agnostic,Types,在有符号变量上使用无符号变量何时合适?在for循环中如何 我听到了很多关于这方面的意见,我想看看是否有类似于共识的东西 for (unsigned int i = 0; i < someThing.length(); i++) { SomeThing var = someThing.at(i); // You get the idea. } for(unsigned int i=0;i siZype类型< /代码>如果你使用STL类。 < P> C和C++编译

在有符号变量上使用无符号变量何时合适?在
for
循环中如何

我听到了很多关于这方面的意见,我想看看是否有类似于共识的东西

for (unsigned int i = 0; i < someThing.length(); i++) {  
    SomeThing var = someThing.at(i);  
    // You get the idea.  
}
for(unsigned int i=0;i
我知道Java没有无符号的值,这一定是一个简洁的决定

我很高兴在这个问题上有所发现,因为我以前没有认真考虑过

总之,如果要对变量进行算术运算(比如在典型的for循环中),带符号是一个很好的通用选择,即使您完全确定所有数字都是正数

如果要做掩码之类的按位操作,unsigned开始变得更有意义。或者,如果你非常想利用符号位获得额外的正范围


就我个人而言,我喜欢签名,因为我不相信自己会保持一致,避免将这两种类型混合在一起(就像文章警告的那样)。

在您上面的示例中,当“I”始终为正值且范围越大越好时,unsigned就越有用。例如,如果您正在使用“declare”语句,例如:

#declare BIT1 (unsigned int 1)
#declare BIT32 (unsigned int reallybignumber)
尤其是当这些值永远不会改变时

然而,如果你在做一个会计程序,人们对他们的钱不负责任,经常出现赤字,你肯定会想使用“签名”


我同意S圣人,虽然一个好的经验法则是使用Suffic,C实际上默认,所以你被覆盖了。

<代码> siZeSt通常是一个很好的选择,或者是“代码> siZype类型< /代码>如果你使用STL类。

< P> C和C++编译器将在比较有符号和无符号类型时生成警告;在示例代码中,不能使循环变量无符号,并且让编译器生成没有警告的代码(假设所述警告已打开)

很自然地,你编译的时候会一直出现警告,对吧

而且,您是否考虑过使用“将警告视为错误”进行编译,以使其更进一步


使用带符号的数字的缺点是,有一种诱惑使它们过载,例如,值0->n是菜单选择,-1表示未选择任何内容,而不是创建一个包含两个变量的类,一个用于指示是否选择了某个内容,另一个用于存储该选择内容。在你意识到这一点之前,你正在到处测试负一,而编译器却在抱怨你想如何比较菜单选择和你拥有的菜单选择的数量——但这很危险,因为它们是不同类型的。所以不要这样做。

我认为如果您的业务案例表明负数无效,您可能希望显示或抛出一个错误

考虑到这一点,我最近才在处理二进制文件中的数据并将数据存储到数据库中的项目时发现了无符号整数。我故意“破坏”二进制数据,结果得到的是负值,而不是预期的错误。我发现,即使转换了该值,该值对我的商业案例也无效。

我的程序没有出错,结果我把错误的数据输入了数据库。如果我使用了
uint
并且程序失败了,那就更好了。

在该线程的后面,它显示了
unsigned
在检测不可信输入中的溢出方面的优越性。不幸的是,对这个难题提出的“答案”并不都那么好。我的是
template bool range\u check\u sum(无符号a,无符号b){return(a
如果有人有一个使用有符号类型的简单而直接的答案,我很乐意看到。好的对话链接已经失效了。它可用。仅当您处理以字节为单位的内容的大小时。@mk12标准库容器公开
size\u type
成员以进行元素计数,而不仅仅是字节计数。如果可用,应该使用它来代替
std::size\t
,但暗示任何以
size\t
开头的内容只能表示字节是不准确的。我发现这很有帮助:我认为这个问题是基于观点的。提供的代码在这两种情况下都能正常运行,因此您可以同时使用这两种方法。除了性能方面的原因(到目前为止还没有关于性能的答案),这只是个人品味。