我自己确信,在一个项目中,我正在研究有符号整数是大多数情况下的最佳选择,即使其中包含的值永远不会是负数.(更简单的循环反转,更少的错误机会等,特别是对于只能保持0和20之间的值的整数,无论如何.)
出现问题的大多数地方是std :: vector的简单迭代,过去常常是一个数组,之后变为std :: vector.所以这些循环通常如下所示:
for (int i = 0; i < someVector.size(); ++i) { /* do stuff */ }
Run Code Online (Sandbox Code Playgroud)
由于此模式经常使用,因此编译器警告垃圾邮件的数量与签名和未签名类型之间的此比较往往隐藏更多有用的警告.请注意,我们肯定没有带有多个INT_MAX元素的向量,并注意到目前为止我们使用了两种方法来修复编译器警告:
for (unsigned i = 0; i < someVector.size(); ++i) { /*do stuff*/ }
Run Code Online (Sandbox Code Playgroud)
这通常有效但如果循环包含任何代码,如'if(i-1> = 0)......'等,可能会默默地中断.
for (int i = 0; i < static_cast<int>(someVector.size()); ++i) { /*do stuff*/ }
Run Code Online (Sandbox Code Playgroud)
这种变化没有任何副作用,但它确实使循环的可读性降低了很多.(而且它打字更多.)
所以我提出了以下想法:
template <typename T> struct vector : public std::vector<T>
{
typedef std::vector<T> base;
int size() const { return base::size(); }
int max_size() const { return base::max_size(); }
int …Run Code Online (Sandbox Code Playgroud) 在.Net中使用带符号数作为索引的理由是什么?
在Python中,您可以通过发送负数来从数组的末尾开始索引,但在.Net中不是这种情况.对.Net来说,以后添加这样的功能并不容易,因为它可能会在索引时使用特殊规则(是的,一个坏主意,但我猜它会发生)破坏其他代码.
并不是说我曾经需要索引大小超过2,147,483,647的数组,但我真的不明白为什么他们选择签名数字.
是不是因为在代码中使用带符号的数字更为正常?
编辑:我刚刚找到这些链接:
编辑2:好的,Matthew Flaschen发布的帖子还有其他几个很好的理由:
关于已签名和未签名的键值,我已经看到了一些关于每个人现在正在做什么的线索.似乎无符号是最佳的,因为它允许相同成本的两倍数量的行.签名密钥有什么好处吗?
有没有标准的共识?似乎签名是答案,因为"它一直是这样"
很简单的问题:
我有一个程序在整数和长期内进行大量的数学计算.为了适应额外的一点,我做了长长的无符号,因为我只处理正数,现在可以得到更多的值.
奇怪的是,这给了我15%的性能提升,我确认这只是简单地让所有长长的未签名.
这可能吗?使用无符号数字,数学运算真的更快吗?我记得读过没有区别,编译器会自动选择最快的方式,无论是签名还是未签名.这个15%的提升真的是因为vars没有签名,还是可能是我的代码中的其他东西?
而且,如果它真的是从制作无符号瓦尔,应我的目标是让一切(甚至整数)无符号,因为我从来不需要负数,并且每一秒都是重要的,如果我能救它.
有没有一种简单而优雅的方法可以将无符号字节值转换为java中的有符号字节值?例如,如果我只有int值240(二进制(24位+ 11110000)= 32位),我怎样才能得到这个int的有符号值?
我在向无符号位置添加有符号偏移时尝试检测溢出
uint32 position;
int32 offset; // it could be negative
uint32 position = position+offset;
Run Code Online (Sandbox Code Playgroud)
如何检查结果是溢出还是下溢?
我想到了一个丑陋的方式,但不确定它的正确性.
offset < 0 && position + offset >= positionoffset > 0 && position + offset <= position而且我也想知道是否有一种更优雅的方式来做到这一点.
更新:
如果偏移很长,最好的解决方案是什么?
uint32 position;
long offset; // it could be negative
uint32 position = position+offset;
Run Code Online (Sandbox Code Playgroud) 有些问题是为什么Java不支持无符号类型以及有关处理无符号类型的一些问题.我做了一些搜索,看起来Scala也不支持无符号数据类型.Java和Scala的语言设计中的限制,生成的字节码,还是JVM本身?是否有一些语言在JVM上运行,并且在其他方面与Java(或Scala)相同,但是支持无符号原始数据类型?
我到达了需要比较singed和unsigned值的点.到目前为止,我总是修改代码库以完全避免这种情况,但现在我不能这样做.
那么处理烧结和无符号比较的真正正确方法是什么?这是一个混合的C/C++代码库,所以我的问题适用于这两种语言.
我正在检查资源(已签名)与请求的值(未签名).
if (requested > resource.max) return Never;
if (requested > resource.free - resource.assigned) return NotNow;
return Now;
Run Code Online (Sandbox Code Playgroud)
我正在考虑这样的事情(在适用的情况下替换C++变体):
if (requested > (unsigned)INT_MAX) bail_out(); // assert,abort,throw,return....
if ((signed)requested > resource.max) return Never;
if ((signed)requested > resource.free - resource.assigned) return NotNow;
return Now;
Run Code Online (Sandbox Code Playgroud)
我正确地接近这个,还是有更好的方法?
我刚看到一些像这样的C++代码.它正在使用一个条件来决定是向前还是向后走std::vector.编译器没有抱怨,但我认为size_t是无符号的.这有危险吗?
vector<int> v { 1,2,3,4,5 };
bool rev = true;
size_t start, end, di;
if (rev) {
start = v.size()-1;
end = -1;
di = -1;
}
else {
start = 0;
end = v.size();
di = 1;
}
for (auto i=start; i!=end; i+=di) {
cout << v[i] << endl;
}
Run Code Online (Sandbox Code Playgroud) 我一直在阅读一些网站,但没有一个对我有意义.有符号和无符号二进制符号与有符号和无符号变量相同.如果你能帮助我会很高兴:)