30/09/2018, 17:16
Nếu i và j nguyên dương, vậy thì có phải (-i)/j và -(i/j) luôn luôn có giá trị như nhau?
Tôi có một câu hỏi như thế này. Có thể nó hơi củ chuối nhưng mong mọi người cho ý kiến.
Nếu i và j nguyên dương, vậy thì có phải (-i)/j và -(i/j) luôn luôn có giá trị như nhau? Hãy thích lựa chọn của bạn.
Mong được mọi người giúp đỡ. Xin cảm ơn!
Bài liên quan
Theo sách giao khoa toán cấp 2 thì đúng là 2 cái đó như nhau (dấu trừ có thể dịch chuyển bất kì đâu):
Không biết trong lập trình thì nó có khác không .
Bạn có thể nói rõ hơn được không?
giải thích luôn là INT_MIN có giá trị là -2^31 hay 0x80000000. Nếu i = INT_MIN thì -i cũng bằng chính 0x80000000 luôn, vì 0x80000000 + 0x80000000 = 0. Vì vậy (-i)/j ở đây bằng i/j.
Lỗi này cả tỷ số mới có 1 nên còn được gọi là 1-in-a billion bug. Lỗi này còn gặp khi gọi ví dụ x = abs(i) hay x = trị tuyệt đối của i, thì nếu i = INT_MIN thì x là số âm (thay vì số dương).
ví dụ số nguyên 4-bit cho dễ hiểu: SXXX
S là bit dấu: nếu S=0 thì tức là số dương, S=1 là số âm.
với 2 số a và b, nếu a = -b thì a + b = 0
số 1 hệ thập phân là 0001. Vậy thì số -1 phải là 1111, để
bỏ số 1 bên trái đi vì kết quả là số 4-bit, nên còn 0000, vậy 0001 + 1111 = 0, vậy 1111 là -1.
để tìm -a thì làm 2 bước: đảo bit của a rồi cộng 1. Ví dụ để tìm -1 thì
bắt đầu từ 0001
đảo bit: 1110
cộng 1: 1111
số lớn nhất là 0111 hay là số 7 trong hệ thập phân. Số nhỏ nhất là 1000 hay -8 trong hệ thập phân. Vì không có số 8, hay số 4 bit ko biểu diễn được số 8, nên khi tìm -(-8) sẽ ra kết quả là:
bắt đầu từ 1000
đảo bit: 0111
cộng 1: 1000
ra kết quả -(-8) = -8. Xét -(-8) + -8:
cũng ra 0. Như vậy máy tính hiểu -(-8) là -8… Dẫn đến (-i)/j sẽ ra kết quả khác -(i/j): (-(-8))/2 = -8/2 = -4, trong khi -(-8/2) = -(-4) = 4.
Wow. Bạn đúng là 1 cao thủ. Nhưng thực sự thì mình không hiểu hết được những gì bạn nói.
LordTNT gia nhập daynhauhoc xD
P/s: bạn đọc cái đó ở đâu thế
vẫn chưa hiểu được, bạn giải thích cụ thể với 1 số nguyên cụ thể được không ^^
Bạn đọc thêm ở đây nhá
stackoverflow.com
Why the absolute value of the max negative integer -2147483648 is still -2147483648?
Số
8
ở nhị phân là :..0000000001000
Số
-8
ở nhị phân là:..1111111111000
Nên nếu chỉ lấy 4 số thì được 2 dãy giống nhau là 1000
có phải là vì nó tràn ô nhớ phải ôn bạn. giống như là (int) nó cho lưu 4 byte mà INT_MIN thì các ô nhớ đã đầy rồi nên khi cộng thêm thì nó tràn cái số mà cần nhớ phải ôn ^^