标签: long-integer

在C中访问大于UINT_MAX*4大小的内存?

假设我有一个大小为78719476736字节的数组.请注意,在我的C代码中使用malloc动态分配此数组.假设malloc在分配了这么多内存后返回一个有效的指针.此数组的大小大于UINT_MAX(4294967295),即无符号整数的最大限制(32位)

假设我的代码看起来像下面的东西,例如

int *buf;
buf = (int*)malloc(78719476736);
Run Code Online (Sandbox Code Playgroud)

这里78719476736大于4*UINT_MAX.

现在如果我必须引用buf的所有元素,那么因为buf是int*它将是32位,所以它将无法处理我使用malloc(78719476736字节)分配的所有内存元素.

我的问题是不应该将上面的代码更改为使buf为long long(64位变量),因为只有long long变量才能解决我已经分配的大内存.

改变了代码,例如

unsigned long long int buf;
buf = (unsigned long long int*)malloc(78719476736);
Run Code Online (Sandbox Code Playgroud)

实际上我认为,变量buf不应该再是指针,因为任何指针都是32位宽,因此它将无法访问78719476736字节.

所以它应该是一个普通的unsigned long long int,并且我必须将malloc返回指针值转换为unsigned long long int,如上面更改的代码所示,并使用buf访问所有已分配的元素.

我在上面的假设中是否正确?

要么

我混淆/遗失了什么吗?

编辑:如果有帮助,

我正在使用Intel Core 2 Duo(64位CPU)上的WinXP桌面.因此,CPU智能访问超过4 GB的地址空间不应该是一个问题.应该为64位支持启用所有其他组件,即

a.)如何在编译时启用64位编译器支持(我使用的是Visual Studio 2005专业版)

b.)64位操作系统支持 - 我使用的是Windows XP Professional.

谢谢.

-广告.

c pointers long-integer

0
推荐指数
2
解决办法
698
查看次数

是否有一个实现超大,高精度数字的包?

我发现我需要计算大数到高精度.例如:5422300.8452.存储此数据的最佳方法是什么,以便简单的算术运算符可以对其进行操作?我一直在努力做Longs和Doubles的组合,但经过大量的计算后它变得复杂了.我确信有一个简单的解决方案,我还不是那么知识渊博.

好吧基本上,我想通了:我的问题是我想要保持4位小数的精度,但输入一个高位数开始截断数字.例如,我有这个:

Double Remain = (double) Math.round((double quantity/12)*10000)/10000;
Run Code Online (Sandbox Code Playgroud)

这适用于较小的数字,但900000000仍然被截断为7.5的东西.

因此,我基本上需要将数字除以长度,然后取2的模数并将其除以分母,然后舍入结果.然后添加2.

有用!

java variables double android long-integer

0
推荐指数
1
解决办法
965
查看次数

UINT_MAX与C中的ULONG_MAX相同

在解决K&R C书中的练习时,我偶然发现了练习2.1.

起初,我为UINT_MAX作为-1,但后来我用的%u占位符,但现在它让我有相同的号码ULONG_MAX.

在这本书的附录B,他们说,UINT_MAX应该是65535ULONG_MAX4294967295,但在运行时的运动,它的给我两个UINT_MAXULONG_MAX作为4294967295.

这是为什么?

c unsigned kr-c max long-integer

0
推荐指数
1
解决办法
6941
查看次数

相同的测试与jdk6和jdk7得到不同的结果

在尝试比较数据类型'int'和'long'的性能时,我遇到了这个奇怪的问题,基本上我有两个单元测试:

@Test
public void testLongOperationPerformance(){
    StopWatch sw = new StopWatch();
    sw.start();
    long count = 0l;
    for(int i = 0; i < Integer.MAX_VALUE; i ++){
        count++;
    }
    sw.stop();
    System.out.println(count);
    System.out.println(sw.elaspedTimeInMilliSeconds());
}

@Test
public void testIntegerOperationPerformance(){
    StopWatch sw = new StopWatch();
    sw.start();
    int count = 0;
    for(int i = 0; i < Integer.MAX_VALUE; i ++){
        count++;
    }
    sw.stop();
    System.out.println(count);
    System.out.println(sw.elaspedTimeInMilliSeconds());
}
Run Code Online (Sandbox Code Playgroud)

这两个单元测试正在做同样的事情,不同的是一个使用int作为计数器的数据类型,另一个使用long.结果:

jdk6u32 (64 bit):
test with long
2147483635
96
test with int
2147483647
2

jdk7 (64 bit)
test with long
2147483647 …
Run Code Online (Sandbox Code Playgroud)

java performance jdk6 java-7 long-integer

0
推荐指数
1
解决办法
559
查看次数

对于Java中的大量输入,解析很长时间失败

我正在尝试将一个非常大的输入读取为String,然后将其转换long为如下所示:[该程序适用于短输入]

输入是两个int用空格分隔的,例如:"1248614876148768372675689568324619856329856295619253291561358926935829358293587932857923857934572895729511 413241"

我的代码:

import java.io.*;
import java.math.*;
import java.util.*;
public class Solution {
    public static void main(String args[] ) throws Exception {
        Solution obj = new Solution();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());
        String input[]=new String[T];
        for (int i=0;i<T;i++) {
            input[i] = br.readLine();
            }
        for (int i=0;i<T;i++){
            StringTokenizer st = new StringTokenizer(input[i]," ");
                BigInteger N = new BigInteger(st.nextToken());
                BigInteger P = new BigInteger(st.nextToken());
                System.out.println(obj.result(N,P));
            }
        }
    }

    public BigInteger result(BigInteger …
Run Code Online (Sandbox Code Playgroud)

java string long-integer

0
推荐指数
1
解决办法
615
查看次数

为什么不长期100%准确?

我在Linux上尝试使用time -p命令,并编写了一些代码来浪费CPU周期:

#include <iostream>

using namespace std;

int main() {
 long int c;

 long int ss;

 for(c = 0;c < 10000000;c++) {
  ss += c*c;
 }

 cout<<ss<<endl;

 return 0;
}
Run Code Online (Sandbox Code Playgroud)

然而,在运行几次之后我发现了一些有趣的东西:

me@octopus:~/Desktop> ./test
1292030741067648912
me@octopus:~/Desktop> ./test
1292030742538841328
me@octopus:~/Desktop> ./test
1292030742228685600
me@octopus:~/Desktop> ./test
1292030740402651312
me@octopus:~/Desktop> ./test
1292030740207543344
me@octopus:~/Desktop> ./test
1292030740346553856
me@octopus:~/Desktop> ./test
1292030741629275040
me@octopus:~/Desktop> ./test
1292030740397307072
me@octopus:~/Desktop> ./test
1292030742928964784
me@octopus:~/Desktop> ./test
1292030741780094096
Run Code Online (Sandbox Code Playgroud)

我不仅每次都得到相同的数字,正如我所料,我甚至没有得到相同的数字.这里发生了什么?

c++ linux long-integer

0
推荐指数
2
解决办法
335
查看次数

从Web API返回的JSON可以是double还是long,我如何在Java中最有效地处理它?

我正在用java编写一些代码并使用JSON Simple包.我在下面运行此代码

jsonObject.get( "last" ) ;
Run Code Online (Sandbox Code Playgroud)

不幸的是,这可能是长的还是双倍的,解析这个值的最快/最正确的方法是什么?

会是这样的吗?

long lngLast = -1;
double dblLast = -1;

if ( jsonObject.get( "last" ).getClass().getName() == "java.lang.Long" ) {
    lngLast =  (long) jsonObject.get( "last" ) ;
} else {
    dblLast = (double) jsonObject.get("last");
}

if ( lngLast == -1)
    System.out.println( dblLast );
else
    System.out.println( lngLast );
Run Code Online (Sandbox Code Playgroud)

这似乎很荒谬.必须有更好的方法来做到这一点.我试图将长度转换为双倍(我相信我应该能够做到这一点?)但每次都会出错.我希望有人可以用正确或更好的方式教育我.

java double json type-conversion long-integer

0
推荐指数
1
解决办法
985
查看次数

简单的Java整数和长算术

简单的代码没问题

long x =  Integer.MAX_VALUE;
System.out.println(x * 2 + "...." + Long.MAX_VALUE);

= 4294967294....9223372036854775807
Run Code Online (Sandbox Code Playgroud)

但这里发生了什么?为什么-2

System.out.println(2 * Integer.MAX_VALUE + "...." + Long.MAX_VALUE);
=   -2....9223372036854775807
Run Code Online (Sandbox Code Playgroud)

为什么元素是149998,编译器不会将这些转换为long?

    long elements = 2 * Integer.MAX_VALUE + 150000;
System.out.println(elements + "...." + Long.MAX_VALUE);
149998....9223372036854775807
Run Code Online (Sandbox Code Playgroud)

-谢谢

java int long-integer

0
推荐指数
1
解决办法
171
查看次数

Java中长期浮动的信息丢失

如果你调用以下Java方法

void processIt(long a) {
  float b = a;  /*do I have loss here*/
}
Run Code Online (Sandbox Code Playgroud)

将long变量赋值给float变量时,是否会丢失信息?

Java语言规范说浮点类型是long的超类型.

java primitive long-integer

0
推荐指数
2
解决办法
3013
查看次数

Java - long显示错误的值

我必须创建一个从1到100的程序,并计算从分区中得到的数字的单独产品,其余为0,1,2,3,所以基本上我必须计算4种不同的产品.

我尝试用两种方式解决这个问题,两种方式都显示错误的结果:

第一次尝试:

    public class prodmod4 {
public static void main(String[] args){
    int i, k=0;
    long P=1;
    while(k<4){
        for(i=1;i<=100;i++){
            if(i%4==k){
            P=P*i;
            }
        }
        System.out.printf("Produsul numerelor care au restul %d este: %d\n", k, P);
        i=1;
        P=1;
        k++;
    }
}
}
Run Code Online (Sandbox Code Playgroud)

当我运行这个程序时,它给了我:

休息0的数字的乘积是0,休息1 -6661643765781265135,休息2 -2885954222765899776,休息3 -9150527387120197261

第二次尝试:

public class prodmod4v2 {
public static void main(String[] args){
    int i;
    long zero=1, unu=1, doi=1, trei=1;
    for(i=1;i<=100;i++){
        switch(i%4){
        case 0:
            zero=zero*i;
            break;
        case 1:
            unu=unu*i;
            break;
        case 2:
            doi=doi*i;
            break;
        case 3:
            trei=trei*i;
            break;
        default: …
Run Code Online (Sandbox Code Playgroud)

java rest long-integer

0
推荐指数
1
解决办法
649
查看次数