为什么这段代码返回错误的值?
int i=Integer.MAX_VALUE+1;
long l=Integer.MAX_VALUE+1;
System.out.println(l);
System.out.println(i);
Run Code Online (Sandbox Code Playgroud) 请有人亲切地为我解释这个功能谢谢!
int overflow(int x, int y)
{
int result, non_overflow, overflow, result_sign, mask;
result = x + y;
result_sign = result >> 31; //Need help starting from here... I know
//it is shifting 31 bits... but why??
non_overflow = ((x ^ y) | ~(y ^ result)) >> 31;
overflow = ~non_overflow;
mask = overflow << 31;
return (non_overflow & result) | (overflow & (result_sign ^ mask));
}
Run Code Online (Sandbox Code Playgroud) 我坚信有一些奇怪的事情发生,所以我想提出这个问题.
#include <time.h>
#include <stdint.h>
// shall return a monotonically increasing time in microseconds
int64_t getMonotonicTime() {
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
int64_t ret;
ret = ts.tv_sec * 1000000; // #1 HERE
ret += ts.tv_nsec / 1000;
return ret;
}
Run Code Online (Sandbox Code Playgroud)
有问题的行ts.tv_sec * 1000000导致系统溢出,其中time_t和int32位大(在我的系统上恰好是这种情况),每次ts.tv_sec大于2 147.
当我为这个bug编写测试用例时,我发现英特尔icc编译器没有溢出,即使我确信它time_t实际上也32有点宽,即使我禁用了优化.GCC行为确实导致了预期的溢出.
除了未定义的行为,英特尔不会溢出的原因是什么?英特尔开发人员的理由是什么?或者这只是我的误解?
它试图解决这个问题,因为N,K amd M,找到最大的整数T这样N*(K^T) <= M.N,K and M可以是值的10^18.这样long long就足够了.我尝试使用T上的迭代来解决它
int T = 0;
long long Kpow = 1;
while(1)
{
long long prod = N*Kpow;
if(prod > M)
break;
T++;
Kpow = Kpow*K;
}
Run Code Online (Sandbox Code Playgroud)
但由于N*Kpow可能超出范围long long,因此需要使用一些大整数来处理产品.但我发现了一些巧妙处理这种情况的其他代码
long long prod = N*Kpow;
if(prod < 0)
break;
Run Code Online (Sandbox Code Playgroud)
即使我总是看到,在溢出时,变量的值变为负值.总是如此,有时甚至在溢出情况下也会出现正值?
我正在尝试制作一个C程序,用于计算和打印用户输入的制表符,空格和行数.问题在于,当它打印出这些数字时,它们就会大放异彩.这是我的程序代码:
int c, b, t, nl;
b, t, nl = 0, 0, 0;
while ((c = getchar()) != EOF)
{
if (c == '\b')
b++;
if (c == '\t')
t++;
if (c == '\n')
nl++;
}
printf("b=%d t=%d nl=%d\n", b, t, nl);
Run Code Online (Sandbox Code Playgroud)
当我从终端输入一些数据时(3行,一个空格,一个标签),结果是b = 1899313536,t = 32768,并且nl = 3.
我正在使用哈希函数murmur2返回给我一个uint64.
我想将它存储在PostgreSQL中,它只支持BIGINT(带符号64位).
因为我对数字本身不感兴趣,只是对二进制值感兴趣(因为我将它用作检测唯一性的id(我的值为~1000值,64位散列对我来说足够了)我想int64通过"只是"改变类型将其转换为.
如何以一种令编译器满意的方式做到这一点?
我有一个定义的整数列表List<int> myIntList = new List<int>();像往常一样我将使用myIntList.Add()方法向列表添加值 .我面临的问题是列表中的值是动态的(一些计算的结果),可能超过整数可以容纳的最大值.
请考虑以下情形:
int x = int.MaxValue;
myIntList.Add(x + 1);
Run Code Online (Sandbox Code Playgroud)
这将添加-2147483648到列表而不是抛出异常.我需要在这里抛出异常.我知道myIntList.Add(checked(x + 1));会完美地完成这项工作,或者我甚至可以将myIntList.Add()包含在内checked{},如下所示:
checked
{
myIntList.Add(12);
myIntList.Add(int.MaxValue);
myIntList.Add(x + 1);
}
Run Code Online (Sandbox Code Playgroud)
这是我的问题这有什么替代方案吗?我可以定义已检查整数的列表吗?如何在列表中添加的值超出限制的情况下创建引发异常的列表?
更新:
谢谢大家的回复,大多数人建议在将它们添加到列表之前检查整数(如果它超出边界则抛出异常).这与我通过给定的片段所做的相同checked{// add elements },它将抛出异常而不需要任何复杂的条件检查.
在开始时,我写了一个演示来获得2G内存,但我遇到了这样的问题,我不知道为什么,num1,num2,num3有什么不同?
#include<stdio.h>
int main(){
unsigned long num1 = 1024*1024*1024*2;
unsigned long num2 = 1024*1024*1024*2.0;
unsigned long num3 = 1024*1024*1024;
num3 *= 2;
printf("num1:%lu\n num2:%lu\n num3:%lu\n", num1, num2, num3);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
num1:18446744071562067968
num2:2147483648
num3:2147483648
Run Code Online (Sandbox Code Playgroud) 请告诉我以下汇编(伪)代码的结果是什么?
我们已经设置寄存器的所有位EAX为0,这样反过来我们也有AH,AL和AX为0。但是,当我减去最低位AL,我们将采取补和补充,给我们一堆1秒,随后一0。
XOR eax, eax
SUB al 0x01
Run Code Online (Sandbox Code Playgroud)
因此,总而言之,我的问题是在执行上述代码时,将仅AL充满1,或者也将延续到AX和EAX。
我知道的最大正整数数据类型是unsigned long long。有没有办法在C ++中处理2 ^ 9000000的整数。我在代码块中使用了gcc编译器,但也可以在Visual Studio上工作。