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!

nhatlonggunz viết 19:27 ngày 30/09/2018

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):

-i / j 
= i / -j 
= -(i / j)

Không biết trong lập trình thì nó có khác không .

Gió viết 19:22 ngày 30/09/2018
  • toán thì giống nhau
  • tin thì khác:
#include <bits/stdc++.h>
using namespace std;

int main() {
	int a=INT_MIN,b=2;
        cout<<a/(-b)<<endl;
        cout<<(-a)/b<<endl;
	return 0;
}
Nguyễn Văn Dũng viết 19:17 ngày 30/09/2018

Bạn có thể nói rõ hơn được không?

viết 19:33 ngày 30/09/2018

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, để

  0001
+ 1111
 -----
 10000

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:

  1000
+ 1000
 -----
 10000

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.

Nguyễn Văn Dũng viết 19:26 ngày 30/09/2018

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.

*grab popcorn* viết 19:25 ngày 30/09/2018

LordTNT gia nhập daynhauhoc xD
P/s: bạn đọc cái đó ở đâu thế

lâm phúc tài viết 19:18 ngày 30/09/2018

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 ^^

Thành Phạm viết 19:19 ngày 30/09/2018

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

Bạn đọc thêm ở đây nhá

stackoverflow.com
Victor S

Why the absolute value of the max negative integer -2147483648 is still -2147483648?

c, libc
asked by Victor S on 10:51AM - 28 Jun 12


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

lâm phúc tài viết 19:20 ngày 30/09/2018

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 ^^

Bài liên quan
0