Int quá lớn để chuyển thành byte python

Nếu bạn đã thực hiện bất kỳ mã hóa nào trong Python, rất có thể bạn đã sử dụng một số trong một trong các chương trình của mình. Chẳng hạn, bạn có thể đã sử dụng một số nguyên để chỉ định chỉ mục của một giá trị trong danh sách

Nhưng có nhiều thứ hơn về số trong Python ngoài giá trị thô của chúng. Hãy xem ba điều về các con số trong Python mà bạn có thể không biết

#1 - Số Có Phương Pháp

Khá nhiều thứ trong Python là một đối tượng. Một trong những đối tượng đầu tiên bạn tìm hiểu về Python là đối tượng

>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
7 để biểu diễn các chuỗi. Có thể bạn đã thấy cách các chuỗi có các phương thức, chẳng hạn như phương thức
>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
8, trả về một chuỗi mới với tất cả các ký tự chữ thường

>>> "HELLO".lower[]
'hello'

Các số trong Python cũng là các đối tượng và giống như chuỗi, có các phương thức riêng. Ví dụ:  bạn có thể chuyển đổi một số nguyên thành một chuỗi byte bằng phương thức

>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
9

>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'

Tham số

>>> n.to_bytes[length=1, byteorder="big"]
b'\xff'
0 chỉ định số byte sẽ sử dụng trong chuỗi byte và tham số
>>> n.to_bytes[length=1, byteorder="big"]
b'\xff'
1 xác định thứ tự của các byte. Ví dụ: đặt
>>> n.to_bytes[length=1, byteorder="big"]
b'\xff'
1 thành
>>> n.to_bytes[length=1, byteorder="big"]
b'\xff'
3 trả về chuỗi byte có byte quan trọng nhất trước và đặt
>>> n.to_bytes[length=1, byteorder="big"]
b'\xff'
1 thành
>>> n.to_bytes[length=1, byteorder="big"]
b'\xff'
5 đặt byte ít quan trọng nhất trước

255 là số nguyên lớn nhất có thể được biểu diễn dưới dạng số nguyên 8 bit, vì vậy bạn có thể đặt

>>> n.to_bytes[length=1, byteorder="big"]
b'\xff'
6 trong
>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
9 mà không gặp vấn đề gì

>>> n.to_bytes[length=1, byteorder="big"]
b'\xff'

Tuy nhiên, nếu bạn đặt

>>> n.to_bytes[length=1, byteorder="big"]
b'\xff'
6 trong
>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
9 cho 256, bạn sẽ nhận được một
>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
60

>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
6

Bạn có thể chuyển đổi một chuỗi byte thành một số nguyên bằng phương thức lớp

>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
61

>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
9

Các phương thức lớp được gọi từ tên lớp thay vì thể hiện của lớp, đó là lý do tại sao phương thức

>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
61 được gọi trên
>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
63 ở trên

🤓

Mọt sách nhỏ. 1729 là số nguyên dương nhỏ nhất có thể được viết dưới dạng tổng của hai lập phương dương theo hai cách khác nhau — một sự thật được gán cho nhà toán học Ấn Độ Srinivasa Ramanujan, người đã tiết lộ tính chất này cho người cố vấn của mình là G. h. cứng rắn.

"Tôi [Hardy] nhớ một lần đến gặp anh ấy [Ramanujan] khi anh ấy bị ốm ở Putney. Tôi đã đi trên chiếc taxi số 1729 và nhận xét rằng con số này đối với tôi có vẻ khá buồn tẻ và tôi hy vọng đó không phải là một điềm xấu. “Không,” anh ấy trả lời, “đó là một con số rất thú vị; . '"

Một trong những cách bạn có thể biểu diễn 1729 dưới dạng tổng của hai lập phương là 1³ + 12³. Bạn có thể tìm cách khác không?

Số dấu phẩy động cũng có phương thức. Có lẽ phương pháp hữu ích nhất cho số float là

>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
64 được sử dụng để kiểm tra xem một số float có phần phân số hay không

>>> "HELLO".lower[]
'hello'
3

Một phương thức float thú vị là phương thức

>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
65, trả về một bộ chứa tử số và mẫu số của phân số biểu thị giá trị dấu phẩy động

>>> "HELLO".lower[]
'hello'
5

Tuy nhiên, do lỗi biểu diễn dấu phẩy động, phương thức này có thể trả về một số giá trị không mong muốn

>>> "HELLO".lower[]
'hello'
6

Nếu cần, bạn có thể gọi các phương thức số trên các chữ số bằng cách bao quanh các chữ bằng dấu ngoặc đơn

>>> "HELLO".lower[]
'hello'
7

Nếu bạn không bao quanh một chữ số nguyên bằng dấu ngoặc đơn, bạn sẽ thấy một ____166 khi bạn gọi một phương thức — mặc dù, lạ thay, bạn không cần dấu ngoặc đơn với chữ số dấu phẩy động

>>> "HELLO".lower[]
'hello'
9

Bạn có thể tìm thấy danh sách đầy đủ các phương thức có sẵn trên các loại số của Python trong tài liệu

#2 - Các số có thứ bậc

Trong toán học, các con số có một hệ thống phân cấp tự nhiên. Ví dụ: mọi số tự nhiên đều là số nguyên, mọi số nguyên là số hữu tỉ, mọi số hữu tỉ là số thực và mọi số thực đều là số phức

Điều này cũng đúng với các số trong Python. “Tháp số” này được thể hiện thông qua các kiểu trừu tượng có trong mô-đun

>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
67

Tháp số

Mỗi số trong Python là một thể hiện của lớp

>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
68

>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
0

Nếu bạn cần kiểm tra xem một giá trị trong Python có phải là số hay không, nhưng bạn không quan tâm giá trị đó thuộc loại số nào, hãy sử dụng

>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
69

Python đi kèm với bốn loại trừu tượng bổ sung có hệ thống phân cấp, bắt đầu bằng loại số chung nhất, như sau

  1. Lớp
    >>> n = 255
    >>> n.to_bytes[length=2, byteorder="big"]
    b'\x00\xff'
    90  được sử dụng để biểu diễn các số phức. Có 1 loại
    >>> n = 255
    >>> n.to_bytes[length=2, byteorder="big"]
    b'\x00\xff'
    90 bê tông lắp sẵn.
    >>> n = 255
    >>> n.to_bytes[length=2, byteorder="big"]
    b'\x00\xff'
    92
  2. Lớp
    >>> n = 255
    >>> n.to_bytes[length=2, byteorder="big"]
    b'\x00\xff'
    93  được sử dụng để biểu diễn các số thực. Có một loại
    >>> n = 255
    >>> n.to_bytes[length=2, byteorder="big"]
    b'\x00\xff'
    94 bê tông lắp sẵn.
    >>> n = 255
    >>> n.to_bytes[length=2, byteorder="big"]
    b'\x00\xff'
    95
  3. Lớp
    >>> n = 255
    >>> n.to_bytes[length=2, byteorder="big"]
    b'\x00\xff'
    96  được sử dụng để biểu diễn các số hữu tỉ. Có 1 loại
    >>> n = 255
    >>> n.to_bytes[length=2, byteorder="big"]
    b'\x00\xff'
    96 bê tông lắp sẵn.
    >>> n = 255
    >>> n.to_bytes[length=2, byteorder="big"]
    b'\x00\xff'
    98
  4. Lớp
    >>> n = 255
    >>> n.to_bytes[length=2, byteorder="big"]
    b'\x00\xff'
    99  được sử dụng để biểu diễn các số nguyên. Có hai loại
    >>> n = 255
    >>> n.to_bytes[length=2, byteorder="big"]
    b'\x00\xff'
    99 bê tông tích hợp.
    >>> n = 255
    >>> n.to_bytes[length=2, byteorder="big"]
    b'\x00\xff'
    63 và
    >>> "HELLO".lower[]
    'hello'
    32

Đợi đã. Giá trị

>>> "HELLO".lower[]
'hello'
32 là số?. Đúng. Bạn có thể xác minh tất cả những điều này trong REPL của mình

>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
1

Thoạt nhìn, mọi thứ dường như đúng ở đây — ngoài các giá trị

>>> "HELLO".lower[]
'hello'
32 là số, có lẽ

🐍

Tính đặc thù của Python. Vì loại

>>> "HELLO".lower[]
'hello'
32 là
>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
99 — trên thực tế,
>>> "HELLO".lower[]
'hello'
32 kế thừa trực tiếp từ
>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
63 — bạn có thể thực hiện một số nội dung khá kỳ lạ với
>>> "HELLO".lower[]
'hello'
39 và
>>> "HELLO".lower[]
'hello'
50.

Ví dụ: bạn có thể sử dụng
>>> "HELLO".lower[]
'hello'
39 làm chỉ mục để nhận giá trị thứ hai của một lần lặp. Nếu bạn chia một số cho
>>> "HELLO".lower[]
'hello'
50, bạn sẽ gặp lỗi
>>> "HELLO".lower[]
'hello'
53.

Thử chạy
>>> "HELLO".lower[]
'hello'
54 và
>>> "HELLO".lower[]
'hello'
55 trong REPL của bạn.

Tuy nhiên, hãy xem xét kỹ hơn, có một số điều hơi kỳ lạ về hệ thống phân cấp số của Python

Số thập phân không vừa

Có bốn kiểu số cụ thể tương ứng với bốn kiểu trừu tượng trong tháp số Pythons.

>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
92,
>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
95,
>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
98 và
>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
63. Nhưng Python có loại số thứ năm, lớp
>>> "HELLO".lower[]
'hello'
60, được sử dụng để biểu diễn chính xác các số thập phân và khắc phục các hạn chế của số học dấu phẩy động

Bạn có thể đoán rằng số

>>> "HELLO".lower[]
'hello'
60 là số
>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
94, nhưng bạn đã nhầm

>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
2

Trên thực tế, loại duy nhất mà số

>>> "HELLO".lower[]
'hello'
60 kế thừa là lớp
>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
68 của Python

>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
3

Điều hợp lý là

>>> "HELLO".lower[]
'hello'
60 không kế thừa từ
>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
99. Ở một mức độ nào đó, cũng có nghĩa là
>>> "HELLO".lower[]
'hello'
60 không kế thừa từ
>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
96. Nhưng tại sao
>>> "HELLO".lower[]
'hello'
60 không kế thừa từ
>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
94 hoặc
>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
90?

Câu trả lời nằm trong mã nguồn CPython

Số thập phân có tất cả các phương thức được chỉ định bởi
>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
94 abc, nhưng nó không nên được đăng ký dưới dạng
>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
94 vì số thập phân không tương tác với số float nhị phân [i. e.
>>> "HELLO".lower[]
'hello'
74 không xác định]. Tuy nhiên, thực tế trừu tượng dự kiến ​​​​sẽ tương tác với nhau [i. e. R1 + R2 sẽ hoạt động nếu R1 và R2 đều là Số thực]

Tất cả tập trung vào việc thực hiện

Phao thật kỳ lạ

Một mặt, số float triển khai lớp cơ sở trừu tượng

>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
94 và được sử dụng để biểu diễn số thực. Nhưng nhờ các ràng buộc bộ nhớ hữu hạn, các số dấu phẩy động chỉ là các xấp xỉ hữu hạn của các số thực. Điều này dẫn đến các ví dụ khó hiểu, như sau

>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
4

Các số dấu phẩy động được lưu trữ trong bộ nhớ dưới dạng phân số nhị phân, nhưng điều này gây ra một số vấn đề. Giống như phân số \[\frac{1}{3}\] không có biểu diễn thập phân hữu hạn — có vô số phần ba sau dấu thập phân — phân số \[\frac{1}{10}\] không có nhị phân hữu hạn

Nói cách khác, bạn không thể lưu trữ 0. 1 trên máy tính với độ chính xác tuyệt đối — trừ khi máy tính đó có bộ nhớ vô hạn

Từ quan điểm toán học nghiêm ngặt, tất cả các số dấu phẩy động đều là số hữu tỉ — ngoại trừ

>>> "HELLO".lower[]
'hello'
76 và
>>> "HELLO".lower[]
'hello'
77. Nhưng các lập trình viên sử dụng chúng để tính gần đúng các số thực và phần lớn coi chúng là số thực

🐍

Tính đặc thù của Python.

>>> "HELLO".lower[]
'hello'
77 là một giá trị dấu phẩy động đặc biệt đại diện cho các giá trị "không phải là số" — thường được viết tắt là giá trị
>>> "HELLO".lower[]
'hello'
79. Nhưng vì
>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
95 là một kiểu số, nên
>>> "HELLO".lower[]
'hello'
91 trả về
>>> "HELLO".lower[]
'hello'
39.

Đúng vậy. giá trị "không phải là số" là số.

Phao thật kỳ lạ

#3 - Số có thể mở rộng

Các kiểu cơ sở số trừu tượng của Python cho phép bạn tạo các kiểu số cụ thể và trừu tượng tùy chỉnh của riêng bạn

Ví dụ, hãy xem xét lớp

>>> "HELLO".lower[]
'hello'
93 sau đây thực hiện các số có dạng \[a + b\sqrt{p}\] trong đó \[a\] và \[b\] là số nguyên và \[p\] là số nguyên tố [

>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
5

Bạn cần triển khai nhiều phương thức dunder để đảm bảo loại cụ thể thực hiện giao diện

>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
94. Bạn cũng phải xem xét các phương thức như
>>> "HELLO".lower[]
'hello'
95 và
>>> "HELLO".lower[]
'hello'
96 tương tác với các loại
>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
94 khác như thế nào

Ghi chú. Không có nghĩa là ví dụ trên được dự định là hoàn chỉnh - cũng không hoàn toàn chính xác, đối với vấn đề đó. Mục đích duy nhất của nó trong cuộc sống là cho bạn nếm trải những gì có thể

Với việc triển khai

>>> "HELLO".lower[]
'hello'
93, giờ đây bạn có thể làm những việc như thế này

>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
6

Hệ thống phân cấp số của Python khá linh hoạt. Nhưng, tất nhiên, bạn phải luôn cẩn thận khi triển khai các kiểu bắt nguồn từ các kiểu cơ sở trừu tượng tích hợp sẵn. Bạn cần chắc chắn rằng họ chơi tốt với những người khác

Có một số mẹo trong tài liệu dành cho người triển khai loại mà bạn nên đọc trước khi triển khai các loại số tùy chỉnh. Cũng rất hữu ích khi xem qua việc triển khai

>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
98

Phần kết luận

Vì vậy, có bạn có nó. Ba điều [có thể cộng thêm nhiều điều nữa] mà bạn có thể chưa biết về các con số trong Python

Làm cách nào để chuyển đổi int thành byte Python?

Một giá trị int có thể được chuyển đổi thành byte bằng cách sử dụng phương thức int. to_bytes[] .

Có bao nhiêu byte là một int trong Python?

Để an toàn, Python phân bổ một số byte cố định không gian trong bộ nhớ cho mỗi biến thuộc loại số nguyên thông thường, được gọi là int trong Python. Thông thường, một số nguyên chiếm bốn byte hoặc 32 bit.

Chúng ta có thể gán byte cho int không?

Một đối tượng byte có thể được chuyển đổi thành giá trị số nguyên một cách dễ dàng bằng Python . Python cung cấp cho chúng ta nhiều phương thức dựng sẵn khác nhau như from_bytes[] cũng như các lớp để thực hiện chuyển đổi xen kẽ này.

Điều gì xảy ra khi int được chuyển đổi thành byte?

Khi một giá trị số nguyên được chuyển đổi thành một byte, Java sẽ cắt 24 bit ngoài cùng bên trái . Chúng tôi sẽ sử dụng bitwise AND để che giấu tất cả các bit dấu hiệu không liên quan.

Chủ Đề