01/10/2018, 10:31

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 đỡ

HK boy viết 12:41 ngày 01/10/2018

@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.
Trần Hoàn viết 12:39 ngày 01/10/2018

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.

Đối với các kiểu dữ liệu không dấu (ví dụ unsigned int) thì tất cả các bit đều để biểu thị độ lớn. 200 => (0000000...00)11001000 (kiểu dữ liệu n byte thì thêm các bit 0 cho đủ n*8 bit) Đối với các kiểu dữ liệu có dấu (ví dụ int) thì bit đầu tiên thể hiện có dấu hay không (true hay 1 tức là có dấu -56 => (1|111111...11)1001000 ((kiểu dữ liệu n byte thì thêm các bit 1 sau bit "âm dương" cho đủ n*8 bit) Kiểu unsigned char (1 byte) gồm 8 bit dữ liệu, biểu diễn các giá trị từ 2 ^ 0 - 1(= 0) đến 2…

Văn Dương viết 12:38 ngày 01/10/2018

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.

Bài liên quan
0