您能否使用 ++ 运算符递增长文字并访问 java 中的整个长文字范围?

Can you increment a long literal using the ++ operator and have access to the whole long literal range in java?

我正在写一个临时的小私人 'block chain' 用于说明目的,用作教学工具。我已经解决了所有核心功能,但我在考虑区块链的一些更特殊的方面,发现自己对 java 中的多头感到疑惑。我在应用程序中内置的 'miner' 方法使用 ++ 运算符递增 long 类型的现时值,直到满足条件。我的问题是,如果我想避免(或至少大大延长)耗尽整数 nonce space (2147483647) 的机会,如果我初始化了起始 nonce 值,我将 Nonce = 0L 传递给 miner 方法;我可以用 ++ 运算符递增它并使用完整的长文字范围吗?

据我了解,比特币在交易中使用特殊的输入值,and/or 一些矿工会略微更改 "ExtraNonce" 的时间戳,但由于这只是为了说明目的,我不想要尽可能地在应用程序中包含类似的东西。

如果有人出于任何原因想要查看它们,我可以提供代码片段,任何想法将不胜感激!

代码如下:

(请不要在我有问题的 if/else 控制逻辑上质问我,这不是合法的生产应用程序,我在 java 中仍然是新手)

这是启动器 class 调用矿工方法的代码:

 } else if (cliInput.contentEquals("mine")) {
                Scanner howMany = new Scanner(System.in);
                System.out.println("\n");
                System.out.println("Enter number of blocks to mine: \n");
                int howManyBlocks = howMany.nextInt();
                int numBlocksMined = 0;
                while (howManyBlocks >= numBlocksMined) {
                    MainChain mc = new MainChain();
                    long indexValue = (HashArray.hashArray.size() / 8);
                    long timeStamp = mc.getUnixTimestamp();
                    String data = helpers.SHA256.generateHash(pubKey + addressKey);
                    String previousHash = mc.getPreviousBlockHash();
                    ChainBuilder cb = new ChainBuilder();
                    cb.miner(indexValue, timeStamp, data, 0, previousHash, 5);
                    numBlocksMined++;
                }

这里是矿工方法的核心:

public void miner(long index, long currentTimeMillis, String data, long Nonce, String previousBlockHash, int difficulty) throws InterruptedException {
        this.index = index;
        this.currentTimeMillis = currentTimeMillis;
        this.pszTimeStamp = pszTimeStamp;
        this.Nonce = Nonce;
        this.previousBlockHash = previousBlockHash;
        this.difficulty = difficulty;
        this.data = data;
        boolean iterator = true;

        String blockHeader = (index + currentTimeMillis + data + Nonce + previousBlockHash + difficulty);
        String hash = SHA256.generateHash(blockHeader);

        startTime = System.nanoTime();
        TimeUnit.SECONDS.sleep(1);
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("\n");
                System.out.println("Current hash rate: " + hashRate + " " + "hash/s");
            }
        }, 0, 3000);

        while (iterator) {
            blockHeader = (index + currentTimeMillis + data + Nonce + previousBlockHash + difficulty);
            hash = SHA256.generateHash(blockHeader);
            if (difficulty == 1) {

                if (!hash.startsWith("0")) {
                    Nonce++;
                    endTime = System.nanoTime();
                    deltaN = endTime - startTime;
                    deltaS = (deltaN / 1000000000);
                    hashRate = (Nonce / deltaS);

                } else {
                    System.out.println("Hash found!");
                    System.out.println("[" + hash + "]");
...............

我想知道的是,如果我将 0L 而不是 0 传递给矿工方法,我是否可以访问整个范围?

所以代替:

cb.miner(indexValue, timeStamp, data, 0, previousHash, 5);

我可以像这样传递它以利用整个长文字范围吗?

cb.miner(indexValue, timeStamp, data, 0L, previousHash, 5);

是的,long ++ 将使用指令集 laddiadd 用于 int)。

6.5 Instruction#s#ladd


因为你的问题随着你的编辑而完全改变了,我仍然看到它..

cb.miner(indexValue, timeStamp, data, 0, previousHash, 5);

如果您像这样传递 0,它将被视为 int,因此您只能将 MAX_INTEGER 放在那里,尽管方法参数接受 long(它将在方法主体中被这样对待)。

++ 运算符在 long 变量上按预期工作。