Mình thường thấy trong chương trình thường người ta thường khai báo:
unsigned int x;
int x;
signed int x;
unsigned x;
signed x;
Vậy cho mình hỏi sự khác nhau giữa những cách khai báo này là gì? Tại sao lại có sự khác nhau đó?
Mình thường thấy trong chương trình thường người ta thường khai báo:
unsigned int x;
int x;
signed int x;
unsigned x;
signed x;
Vậy cho mình hỏi sự khác nhau giữa những cách khai báo này là gì? Tại sao lại có sự khác nhau đó?
Bạn có thể hiểu signed
là kiểu dữ liệu có dấu và unsigned
là kiểu dữ liệu không dấu, điểm khác biệt giữa hai loại này chính là miền giá trị của chúng. Mặc dù có nhiều cách khai báo nhưng chúng đều thuộc 1 trong 2 kiểu dữ liệu có dấu hoặc không dấu thôi
int
vào để được unsigned int x.Ví dụ khi khai báo kiểu dữ liệu số nguyên có dấu và không dấu
int a; // a sẽ có miền giá trị từ -2147483648 đến 2147483647
unsigned int a; // a sẽ có miền giá trị từ 0 đến 4294967295
Do sự khác nhau về miền giá trị giữa hai kiểu dữ liệu này cho nên khả năng lưu trữ dữ liệu của chúng cũng khác nhau.
Trong khi kiểu dữ liệu có dấu signed
có thể lưu trữ được số nguyên âm nhưng miền giá trị của nó bị hạn chế chỉ đạt tới 2147483647. Giả sử bạn khai báo số nguyên có dấu vượt quá giá trị này thì sao?
#include <iostream>
using namespace std;
int main(){
int a = 2147483648;
cout << a << endl; // a sẽ bằng -2147483648
return 0;
}
Trong lập trình, vấn đề này gọi là bị tràn số. Tức là giá trị của a
sẽ chỉ quanh quẩn trong miền giá trị của nó, nếu bạn khai báo vượt quá giới hạn cho phép, nó sẽ quay lại giá trị trong miền xác định của nó, ở đây chúng ta khai báo giá trị vượt quá giới hạn cho phép 1 đơn vị cho nên nó quay lại miền xác định của nó 1 đơn vị, kết quả là -2147483648.
Vì miền giá trị của kiểu số nguyên không dấu unsigned
từ 0 đến 4294967295 nên đoạn code trên nếu thay int a
bằng unsigned int a
thì sẽ không có vấn đề gì xảy ra, nếu bạn khai báo giá trị biến vượt quá giới hạn cho phép thì kết quả sẽ tương tự như trường hợp số nguyên có dấu.
Điều này dẫn tới chương trình của bạn bị sai, cho nên đối với những số lớn, bạn nên dùng kiểu dữ liệu float
, double
, ...v.v, với ngôn ngữ lập trình cấp cao thì bạn chả cần quan tâm tới vấn đề này nữa.