- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
考虑以下代码示例:
#include
#include
int chính()
{
std::string str("someString"); // length 10
int num = -11;
std::cout << num % str.length() << std::endl;
}
hiện hữu http://cpp.sh 上运行此代码,结果我得到了 5
,而我期望它是 -1
。
我知道发生这种情况是因为 str.length()
的类型是 kích thước_t
,它是一个依赖于无符号的实现,并且因为发生了隐式类型转换导致 trong một
从 signed int
转换为无符号 kích thước_t
的二元运算符(更多 đây );这会导致负值变为正值并弄乱运算结果。
可以考虑通过显式转换为 số nguyên
来解决这个问题:
num % (int)str.length()
这可能有效,但不能保证,例如在长度大于 số nguyên
的最大值的字符串的情况下。可以使用更大的类型来降低风险,例如 dài dài
,但是如果 kích thước_t
Đúng unsigned long long
怎么办?同样的问题。
您将如何以可移植且稳健的方式解决这个问题?
câu trả lời hay nhất
自 C++11 起,您只需将 chiều dài
的结果转换为 std::string::difference_type
。
要解决“但是如果尺寸太大怎么办?”:
这不会发生在 64 位平台上,即使您在较小的平台上也是如此:您最后一次实际拥有一个字符串占用超过总 RAM 一半的时间是什么时候?除非你正在做非常具体的事情(你会知道),否则使用 difference_type
就可以了;停止与鬼魂战斗。
或者,只需使用 int64_t
,这当然足够大了。 (虽然在某些 32 位处理器上循环一个可能比 int32_t
慢,但我不知道。不过对于那个单模运算来说无关紧要。)
(有趣的事实:甚至一些杰出的委员会成员也认为在标准库中乱放无符号类型是错误的,引用资料请参见 this panel在 9:50、42:40、1:02:50 )
C++11 之前,具有负值的 %
符号是实现定义的,对于定义明确的行为,请使用 std::div
加上上面描述的 Actor 之一。
关于c++ - 如何在 size_t 上使用余数运算符获得负余数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38146365/
Tôi là một lập trình viên xuất sắc, rất giỏi!