我总是使用unsigned int来表示永远不应该是负数的值.但是今天我在代码中发现了这种情况:
void CreateRequestHeader( unsigned bitsAvailable, unsigned mandatoryDataSize,
unsigned optionalDataSize )
{
If ( bitsAvailable – mandatoryDataSize >= optionalDataSize ) {
// Optional data fits, so add it to the header.
}
// BUG! The above includes the optional part even if
// mandatoryDataSize > bitsAvailable.
}
Run Code Online (Sandbox Code Playgroud)
我应该开始使用int而不是unsigned int来表示数字,即使它们不能为负数吗?
我正在调查我的团队使用size_tvs int(或long等)的标准.我看到的最大的缺点是,两个size_t对象的区别可能会导致问题(我不确定具体的问题 - 可能是某些东西没有补充,而签名/无符号会使编译器生气).我使用V120 VS2013编译器在C++中编写了一个快速程序,允许我执行以下操作:
#include <iostream>
main()
{
size_t a = 10;
size_t b = 100;
int result = a - b;
}
Run Code Online (Sandbox Code Playgroud)
该程序导致了-90,虽然正确,但让我对类型不匹配,有符号/无符号问题感到紧张,或者如果size_t恰好用于复杂的数学运算,则会让我感到紧张.
我的问题是,使用size_t对象进行数学运算是否安全,具体而言,区别对待?我正在考虑使用size_t作为索引之类的标准.我在这里看到了一些关于这个主题的有趣帖子,但是他们没有解决数学问题(或者我错过了它).
我正在处理一些包含表单表达式的代码
-(sizeof(struct foo))
Run Code Online (Sandbox Code Playgroud)
即a的否定,size_t我不清楚编译器在看到这个时C和C++标准需要什么.具体来说,从此处和其他地方四处查看,sizeof返回类型的无符号整数值size_t.当否定无符号整数时,我找不到任何指定行为的明确引用.有没有,如果有的话,它是什么?
编辑:好的,所以关于无符号类型的算术有一些很好的答案,但事实并非如此.如果否定,它是在无符号整数上运行,还是转换为有符号类型并对其执行某些操作?从标准中预期的行为是"想象它是相似幅度的负数,然后对无符号值应用'溢出'规则"?