Ich muss in der Lage sein, eine maximale System-Ganzzahl in Ruby zu bestimmen. Weiß jemand wie oder ob es möglich ist?
86
Ruby konvertiert Ganzzahlen automatisch in eine große Ganzzahlklasse, wenn sie überlaufen, sodass ihre Größe (praktisch) unbegrenzt ist.
Wenn Sie nach der Größe des Computers suchen, dh 64- oder 32-Bit, habe ich diesen Trick bei ruby-forum.com gefunden :
machine_bytes = ['foo'].pack('p').size
machine_bits = machine_bytes * 8
machine_max_signed = 2**(machine_bits-1) - 1
machine_max_unsigned = 2**machine_bits - 1
Wenn Sie nach der Größe von Fixnum-Objekten suchen (Ganzzahlen, die klein genug sind, um in einem einzelnen Maschinenwort gespeichert zu werden), können 0.size
Sie die Anzahl der Bytes abrufen . Ich würde vermuten, dass es bei 32-Bit-Builds 4 sein sollte, aber das kann ich momentan nicht testen. Das größte Fixnum ist anscheinend 2**30 - 1
(oder 2**62 - 1
), da ein Bit verwendet wird, um es als Ganzzahl anstelle einer Objektreferenz zu markieren.
quelle
Fixnum
ist immer 64 Bit (nicht 63 oder 31 Bit wie in YARV), unabhängig von der Größe des Maschinenworts, und es gibt kein Tag-Bit.Das freundliche Handbuch lesen? Wer würde das machen wollen?
quelle
In Ruby werden Fixnums automatisch in Bignums konvertiert.
Um das höchstmögliche Fixnum zu finden, können Sie Folgendes tun:
Schamlos aus einer Ruby-Talk-Diskussion herausgerissen . Suchen Sie dort nach weiteren Details.
quelle
puts (Fixnum::MAX + 1).class
kehrt dies nicht so zurück,Bignum
wie es scheint. Wenn Sie dazu wechseln8
,16
wird.Seit Ruby 2.4 gibt es kein Maximum mehr, da Bignum und Fixnum zu Integer vereinigt wurden. siehe Feature # 12005
Es wird keinen Überlauf geben, was passieren würde, ist ein Mangel an Speicher.
quelle
wie @ Jörg W Mittag betonte: In jruby ist die Größe der festen Nummer immer 8 Byte lang. Dieses Code-Snippet zeigt die Wahrheit:
quelle