4
Kiểu dữ liệu signed và unsigned khác nhau như thế nào?
0
Loinis10 đã đăng:

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 đó?

thêm bình luận...
4
Bảo70 đã đăng:

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

  • unsigned int xunsigned x cùng là dữ liệu kiểu số nguyên không dấu cho nên chúng giống nhau. Khi bạn khai báo unsigned x thì trình biên dịch sẽ tự thêm int vào để được unsigned int x.
  • Tương tự, int x, signed int x, signed x cùng là kiểu dữ liệu số nguyên có dấu cho nên bạn có thể sử dụng một trong ba cú pháp này đều được.

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.

đã bổ sung 3.2 năm trước bởi
Avatar: Bảo Bảo70
thêm bình luận...

Câu trả lời của bạn

Chào mừng bạn đến với cộng đồng chia sẻ tri thức BanhoiTuidap.com, bạn có thể chia sẻ bất kỳ sự hiểu biết, nghiên cứu hoặc kinh nghiệm của mình về câu hỏi này với một số lưu ý:
  • Lịch sự, tế nhị.
  • Hạn chế ghi tắt, câu trả lời của bạn chỉ nên tập trung vào câu hỏi ở trên.
Câu trả lời của bạn sẽ được đăng ở chế độ cộng đồng, cho nên bạn sẽ không thể chỉnh sửa sau khi đăng, có thể đăng ký thành viên trên BanhoiTuidap.com khi bạn muốn theo dõi câu hỏi này hoặc chủ đề liên quan.
Bạn đang thắc mắc? Ghi câu hỏi của bạn và đăng ở chế độ cộng đồng (?)