Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Konversi bilangan floating-point ke bilangan bulat kini memiliki perilaku saturasi pada mesin x86 dan x64. Perilaku saturasi berarti bahwa jika nilai yang dikonversi terlalu kecil atau terlalu besar untuk tipe target, nilai tersebut akan diatur ke nilai minimum atau nilai maksimum untuk tipe itu, sesuai kondisinya.
Dalam .NET 11, perilaku ini juga berlaku untuk konversi tanpa pemeriksaan ke sbyte, byte, short, ushort, dan char pada CoreCLR (termasuk interpreternya) dan Native AOT, namun tidak pada Mono. Untuk detail selengkapnya, lihat Konversi bilangan titik mengambang ke tipe bilangan bulat kecil bersifat jenuh.
Perilaku sebelumnya
Tabel berikut menunjukkan perilaku sebelumnya saat mengonversi suatu nilai float atau double.
| Ubah ke ... | nilai x |
Hasil (Sebelumnya) |
|---|---|---|
int skalar dan terkemas |
int.MinValue <= x <= int.MaxValue |
(int)x |
< int.MinValue atau > int.MaxValue |
int.MinValue |
|
long skalar dan terkemas |
long.MinValue <= x <= long.MaxValue |
(long)x |
< long.MinValue atau > long.MaxValue |
long.MinValue |
|
uint skalar dan dikemas |
Nilai apa pun | (((long)x << 32) >> 32) |
ulong skalar dan terkemas |
<= 2^63 |
(long)x |
> 2^63 |
(long)(x - 2^63) + 2^63 |
Perilaku yang baru
Tabel berikut menunjukkan perilaku baru saat mengonversi nilai float atau double.
| Ubah ke ... | nilai x |
Hasil .NET 9+ |
|---|---|---|
int skalar dan terkemas |
int.MinValue <= x <= int.MaxValue |
(int)x |
< int.MinValue |
int.MinValue |
|
> int.MaxValue |
int.MaxValue |
|
NaN |
0 | |
long skalar dan terkemas |
long.MinValue <= x <= long.MaxValue |
(long)x |
< long.MinValue |
long.MinValue |
|
> long.MaxValue |
long.MaxValue |
|
NaN |
0 | |
uint skalar dan terkemas |
0 <= x <= uint.MaxValue |
(uint)x |
x > uint.MaxValue |
uint.MaxValue |
|
x < 0 |
0 | |
ulong skalar dan terkemas |
0 <= x <= ulong.MaxValue |
(ulong)x |
x > ulong.MaxValue |
ulong.MaxValue |
|
x < 0 |
0 |
Versi yang diperkenalkan
.NET 9 Pratinjau 4
Jenis perubahan yang menyebabkan ketidakcocokan
Perubahan ini adalah perubahan perilaku.
Alasan untuk berubah
Perubahan ini dilakukan untuk menyeragamkan semua konversi dari bilangan floating point ke bilangan bulat agar memiliki perilaku saturasi dan agar bersifat deterministik.
Tindakan yang direkomendasikan
Jika Anda mengandalkan nilai yang ditampilkan di bagian Perilaku sebelumnya untuk dikembalikan dari konversi, meskipun salah, perbarui kode Anda untuk mengharapkan nilai yang ditampilkan di bagian Perilaku baru.
Jika overhead kinerja dari perilaku baru tidak diinginkan dalam skenario Anda, sebagai gantinya Anda dapat menggunakan metode ConvertToIntegerNative<TInteger> baru pada Single, Double, dan Half, yang cepat. Dalam kebanyakan kasus, perilaku metode ini cocok dengan perilaku konversi titik-ke-bilangan bulat mengambang sebelumnya. Namun, metode ini memiliki perilaku khusus platform yang tidak dijamin cocok dengan perilaku konversi sebelumnya (yang sudah tidak deterministik). Sebaliknya, metode ini melakukan apa pun yang paling efisien untuk platform asli. Perlu dicatat bahwa hasilnya tidak dijamin berlaku untuk nilai yang berada di luar rentang yang dapat direpresentasikan oleh tipe TInteger.
Dalam kasus yang jarang terjadi di mana Anda membutuhkan performa dan jaminan ketat untuk mencocokkan perilaku konversi sebelumnya, Anda dapat menggunakan intrinsik perangkat keras khusus platform. Misalnya, Anda dapat menggunakan Sse.ConvertToInt32(Vector128.CreateScalar(val)) untuk menangani (int)val untuk float. Anda harus memeriksa if (Sse.IsSupported) sebelum menggunakan. Namun, menggunakan intrinsik ini sulit, karena platform target lain (Arm64) sudah menghasilkan hasil yang berbeda.
API yang Terpengaruh
Semua konversi eksplisit dan implisit dari bilangan titik mengambang ke bilangan bulat:
-
(int)valdi manavaladalahfloatataudouble Vector.ConvertToInt32(Vector<float> val)-
(long)valdi manavaladalahfloatataudouble Vector.ConvertToInt64(Vector<double> val)-
(uint)valdi manavaladalahfloatataudouble Vector.ConvertToUInt32(Vector<float> val)-
(ulong)valdi manavaladalahfloatataudouble Vector.ConvertToUInt64(Vector<double> val)