|
1
4
如果
请注意,您需要条件–无条件移位让编译器假定
|
|
2
1
第1步。如果
第2步。不要尝试过度换档。
第3步。移位时确保无符号数学。
如果
第4步。检测是否发生减少。
|
|
|
3
1
您是否要求断言该移位是否会导致进位? 在这种情况下,如果不使用内部函数或汇编程序,在c++中就有点麻烦了。
我想这是对的。 这可能更好:
|
|
4
1
在C中,
然后要求中的结果为:x 2 y , 约化模 比结果类型中可表示的最大值多一个
让我们调用该值
这意味着
提供y<32
如果存在溢出,则
6.5.7位移位运算符的完整参考:
这与5.8移位运算符[expr.Shift]中针对C++14的n4296草稿中的C++完全相同:
所以在两种语言中,假设 assert函数在[您的]系统中注册错误 ,代码应为:
|
|
5
1
为了编写一个安全的函数,您必须首先确定哪些是不安全的。如果你不这样做,这项任务就是胡说八道。你提到的那种“溢出”实际上是定义明确的。但存在以下危险行为:
要避免这种情况,您需要确保:
1) 和3)通过使用
2) 通过使用无符号类型并检查其是否太大来解决。 此外,您似乎有一个要求,即不允许左操作数越界。这很奇怪,但好吧,让我们也实现它。可以通过检查MSB位位置加上移位数是否大于31来完成。
请注意,此代码可以进一步优化。 |
|
|
MaPo · Linux,设置锁定ICMP_过滤器选项 1 年前 |
|
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 1 年前 |
|
|
Bobby · 复合字面值总是左值吗? 1 年前 |
|
9-Pin · C: 嵌套结构的堆栈内存分配 1 年前 |