Vì sao gán một số lớn vào kiểu int thì ra số âm

vì sao dữ liệu kiểu int khi nó lớn thì ra số âm vậy nhỉ ???
như 30!!=-1409286144 ?
làm sao để ra số dương !
Mong mn giúp đỡ

@chelbay

  • Thêm tag (ngôn ngữ), thêm category, sửa title giúp mình nhé.

  • 30!! là 1 số rất lớn, do vậy số nguyên bị tràn. Kiểu int có giới hạn từ -2^31 -> 2^31-1, nếu vượt quá 2^31-1 thì máy tính quay lại từ -2^31.
    Bạn thử code:

int n = -2^31 - 1; // bạn tự tính rồi thay số vào đây nhé
printf("%d", n+1);
  • Muốn tính số lớn một cách chính xác thì bạn tự code kiểu dữ liệu BigInteger.
1 Like

Cái này gọi là tràn dữ liệu, do cùng 1 cách biểu diễn, tuỳ vào kiểu dữ liệu mà kết quả có thể khác nhau.

2 Likes

int - kiểu nguyên có dấu.
unsigned int - kiểu nguyên không dấu.

Để lưu số nguyên int và unsigned in nó cần n bit.
Với unsigned int, toàn bộ n bit để lưu giá trị và do đó nó nằm trong dải 0 -> 2^n - 1.
Với int, n-1 bit thấp nhất lưu giá trị, bit cao nhất lưu dấu. Nếu bit cao nhất = 1 thì giá trị mang dấu âm. Dải giá trị từ -2^(n-1) + 1 đến 2^(n-1) -1.

Trong quá trình gán sang int. n bit phần nguyên thấp nhất được cắt và đưa vào n bit của int. Nếu trong n bit được cắt này có bit cao nhất là 1 thì biến int mang dấu âm.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?