1
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 6.3 năm trước bởi
Avatar: Bảo Bảo70

rất hay và hữu ích , thank you!

buivandong 02.12.2021

cho mình hỏi thêm là nếu kiểu dữ liệu không dấu có thể handle miền giá trị lớn hơn vậy chúng ta thêm kiểu dữ liệu có dấu mục đích để làm gì?

Cộng đồng 03.12.2021

như cái tên của nó đã nói lên rồi, sử dụng kiểu dữ liệu có dấu để lưu số có dấu nha bạn, ví dụ số âm chẳng hạn, bạn thử khởi tạo unsigned int x = -1 thì sẽ biết kết quả, các ngôn ngữ lập trình bậc cao sau này người ta mặc định là sử dụng kiểu dữ liệu có dấu hết.

Cộng đồng 04.12.2021
thêm bình luận...
Bạn đang thắc mắc? Ghi câu hỏi của bạn và đăng ở chế độ cộng đồng (?)