这个问题可能是愚蠢或偏执的,但无论如何:-).给出以下代码:
DWORD hiRes;
// will overflow about once in an hour
hiRes = GetTickCount() * 1193L;
Run Code Online (Sandbox Code Playgroud)
如果知道hiRes周期性溢出并且这种情况得到妥善处理,那么这段代码有什么问题吗?
更新:
结果对我来说非常令人惊讶,因为答案取决于hiRes(有符号或无符号)的类型,它由C标准定义(参见例如).
我有以下代码INT_MIN/-1.我希望这可能是INT_MAX + 1(或翻转时为0).但是,我得到的实际结果是INT_MIN.这是我的测试代码:
#define __STDC_LIMIT_MACROS
#include <stdint.h>
#include <stdio.h>
#include <limits.h>
using namespace std;
int main()
{
int min=INT_MIN;
int res=min/-1;
printf("result: %i\n", res);
printf("max: %i min: %i\n", INT_MAX, INT_MIN);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
此实现是特定的和/或未定义的行为吗?
请考虑以下代码:
$ cat o.c
#include <stdio.h>
#include <limits.h>
int absolute(int i) {
int j = i < 0 ? -i : i;
if (j<0) /* This is line 6 */
return 0;
return j;
}
int main() {
int i = 1;
printf("%d %d\n", i, absolute(i));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
用它编译-O2并-Wstrict-overflow产生警告:
$ gcc -O2 -Wall -Wextra -Wstrict-overflow o.c
o.c: In function ‘absolute’:
o.c:6:6: warning: assuming signed overflow does not occur when simplifying comparison of absolute value and …Run Code Online (Sandbox Code Playgroud) 这是假的:
(0xffffffff << 31 << 1) === (0xffffffff << 32)
Run Code Online (Sandbox Code Playgroud)
看起来应该是真的.添加>>> 0任何地方都不会改变这一点
为什么这样,我怎样才能正确编写处理的代码<< 32?
javascript unsigned bit-manipulation integer-overflow bit-shift
我正在研究一个需要接受和显示复杂分数的系统.接受分数并将它们转换为double作品的代码,但是当我想显示该值时,我需要转换回小数表示.
编辑:我已经修复了溢出问题,但是没有解决像1/3或5/6这样的分数.所以我设计了一种非常黑客的方法来做到这一点.我有代码生成1-> 64的每个分数0-> 64的十进制表示,并保存最简化的形式.这样,我可以遍历列表并找到最接近的分数,并简单地显示它.我有一些后会发布代码.
我现在的代码适用于绝大多数数字,但偶尔我会得到一小部分数字1/321.这会转换为double,但不能转换回来,因为在我的方法中,分子会导致整数溢出.
这是我的代码,我想知道是否有更好的方法,或者是否有一些方法可以安全地将这些转换为long而不会失去正确结果所需的精度:
public static String DecimalToFraction(double dec)
{
string str = dec.ToString();
if (str.Contains('.'))
{
String[] parts = str.Split('.');
long whole = long.Parse(parts[0]);
long numerator = long.Parse(parts[1]);
long denominator = (long)Math.Pow(10, parts[1].Length);
long divisor = GCD(numerator, denominator);
long num = numerator / divisor;
long den = denominator / divisor;
String fraction = num + "/" + den;
if (whole > 0)
{
return whole + " " + fraction;
}
else
{ …Run Code Online (Sandbox Code Playgroud) userid := 12345
did := (userid & ^(0xFFFF << 48))
Run Code Online (Sandbox Code Playgroud)
在编译这段代码时,我得到了:
./xxxx.go:511: constant -18446462598732840961 overflows int
你知道这件事有什么关系吗?如何解决?谢谢.
任何人都可以解释为促进理由uint8_t来int?这种行为有什么用例?我可以阻止推广吗?
我有这些非常简单的代码片段,它们将两个整数类型组合在一起并打印结果.我编译了那些没有任何优化的g++ --std=c++11 main.cpp -o test
int main()
{
uint8_t a = 200, b = 100;
uint16_t result = (a + b);
printf("result is %d\n", result);
}
Run Code Online (Sandbox Code Playgroud)
输出:
结果是300
我本来期望(a + b)评估,44因为它们都是8位类型,应该溢出.但相反,我得到了意想不到的结果300.
如果我用uint32_t和重新运行相同的测试uint64_t,它会溢出预期:
int main()
{
uint32_t a = UINT_MAX, b = UINT_MAX;
uint64_t result = (a + b);
printf("result is %ld\n", result);
}
Run Code Online (Sandbox Code Playgroud)
输出:
结果是4294967294
现在我不知道为什么uint8_t被区别对待uint32_t.
以下示例用于说明我的问题:
#include <iostream>
#include <string>
int main()
{
signed char p;
signed char temp=100;
signed char t=4;
p = (temp+temp+temp+temp)/t;
std::cout << "Hello, " << int(p)<< "!\n";
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,变量p被定义为四个singed char变量的平均值.但是,signed char变量(temp + temp + temp + temp)的总和将大于signed char的范围.所以我的问题是C++如何处理这种情况.
有符号整数在x86上通过二进制补码表示,其中符号位具有该值-(2^N).这导致在-2^N和2^N - 1(例如-32768通过32767)之间的典型可表示值范围.
我很好奇如果我在我的系统上取最小有符号整数值并乘以它以-1试图"强制"一个大于我系统上有符号整数的最大可表示值的最大值,会发生什么.
#include <stdio.h>
#include <limits.h>
int main(void){
signed int x, y;
x = INT_MIN;
y = x * -1;
printf("%d\n%d\n", x, y);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这导致以下输出:
# gcc -std=c89 -pedantic int_min_test.c
# ./a.out
-2147483648
-2147483648
Run Code Online (Sandbox Code Playgroud)
我期待一个整数溢出(导致典型的值翻转),但看起来似乎没有关于xwith 的乘法操作-1.
在x86中是否INT_MIN与-1no-op 相乘?
我已经编写了一些代码字段的代码,我认为应该可行,但看起来像GCC不同意.我是否错过了某些内容或者我是否真的在GCC中发现了一个错误?
简化我的代码后,测试用例非常简单.我将整数文字分配给1一个大小为一位的位域:
typedef struct bitfield
{
int bit : 1;
} bitfield;
bitfield test()
{
bitfield field = {1};
return field;
}
Run Code Online (Sandbox Code Playgroud)
如果我使用GCC 6.2.1(与5.4.0相同)编译它,我会收到以下警告(使用-pedantic):
gcc -fPIC test.c -pedantic -shared
test.c: In function ‘test’:
test.c:8:23: warning: overflow in implicit constant conversion [-Woverflow]
bitfield field = {1};
^
Run Code Online (Sandbox Code Playgroud)
奇怪的是:当我用-Woverflow替换-pedantic时,警告消失了.
我没有得到任何警告警告.