Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

int () truncates its result to 32 bits

Aperta Adatta ai principianti
#911 2 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
88/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
javascript, python
Ambito
compilers

Direzione di ricerca

Inizia dalla riga 291 di builtin.js, dove int() usa attualmente la conversione bit a bit di JavaScript, e controlla development/automated_tests/transcrypt/div_issues/init.py per il testlet dell’Issue 911. Fai in modo che i controlli sui numeri interi grandi passino, preservando il troncamento verso zero per i float negativi, quindi esegui il testlet con Node usando le opzioni del compilatore indicate.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

int (x) compiles to float (x) | 0. JavaScript's | converts its left operand with ToInt32, so the result is always a signed 32 bit integer. Arguments outside -2**31 ... 2**31 - 1 come back wrong, multiples of 2**32 come back as 0.

Reproducer

values = [8589934588, 9007199254740988, 2147483648, 4294967296]
for v in values:
    print (v, '->', int (v))

CPython:

8589934588 -> 8589934588
9007199254740988 -> 9007199254740988
2147483648 -> 2147483648
4294967296 -> 4294967296

Transcrypt:

8589934588 -> -4
9007199254740988 -> -4
2147483648 -> -2147483648
4294967296 -> 0

Run with 3.7.16 on Python 3.7, compiled with -b -n -e 6 and executed under
node. Line 291 of __builtin__.js is identical on current master.

The failure is quiet. A memory size in kB, a file offset or a timestamp in microseconds passes 2**31 during normal operation and then yields a small or negative number instead of an error.

Testlet

For development/automated_tests/transcrypt/div_issues/__init__.py:

    autoTester.check ('Issue 911')  # int () truncated to 32 bits
    autoTester.check (int (2147483648))
    autoTester.check (int (4294967296))
    autoTester.check (int (8589934588))
    autoTester.check (int (9007199254740988))
    autoTester.check (int (-5.7), int (5.7))

Possible fix

export function int (any) {
    var f = float (any);
    return f === Infinity || f === -Infinity || isNaN (f) ? 0 : Math.trunc (f);
};

This makes int () exact over the whole range where a JavaScript number is exact, up to 2**53 - 1, and leaves truncation toward zero for negative floats unchanged. With the patch applied the reproducer above matches CPython.

Math.trunc is ES6. The default target is esv 6 and javascriptVersion gates nothing in the code generator, so no version switch is needed. int has no callers inside the runtime.

Note on NaN and Infinity

NaN | 0 and Infinity | 0 currently yield 0, where CPython raises ValueError and OverflowError. The version above keeps the 0 to stay minimal. Raising instead would match CPython but changes behaviour beyond the range fix, so it seems worth deciding separately.

Lingua principale
Python
Stelle
2.9k
Fork
218
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Guida per i contributori

Nessuna guida per i contributori indicizzata per questo repository

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di TranscryptOrg/Transcrypt

Tutte le issue di TranscryptOrg/Transcrypt

Issue simili

Altre issue su Python

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.