Download as pdf or txt
Download as pdf or txt
You are on page 1of 5

Bài A:

Nhập chương trình sau:

#include<stdio.h>
#include<limits.h>

int main(void)
{
printf("The maximum value of UNSIGNED INT = %u\n", UINT_MAX);
printf("The maximum value of UNSIGNED INT = %d\n\n", UINT_MAX)

printf("The maximum value of UNSIGNED LONG = %ld\n", ULONG_MAX);


printf("The maximum value of UNSIGNED LONG = %lu\n", ULONG_MAX);
return(0);
}

Kết quả hiển thị trên màn hình:

1. Điểm khác biệt của các cặp dòng code

Với trường hợp của UINT_MAX:

%u được dùng để biểu diễn giá trị của một số nguyên không dấu. Miền giá trị của số nguyên
không dấu 32-bit là 0 đến (232 - 1). Do đó, UINT_MAX có giá trị là 4,294,967,295.

%d được dùng để biểu diễn giá trị của một số nguyên có dấu. Hệ thống máy tính lưu trữ số
nguyên có dấu ở dạng bù 2 nên miền giá trị của số nguyên có dấu 32-bit là (-231) đến (231-1).

Khi biểu diễn dưới dạng nhị phân, UINT_MAX là một dãy gồm 32 bit 1. Khi sử dụng %d để biểu
diễn UINT_MAX, máy tính sẽ thực hiện phép tính bù 2 để đưa giá trị UNIT_MAX về số âm -1.
Cụ thể như sau:
1111 1111 1111 1111 1111 1111 1111 1111
Chuyển sang dạng bù 2 (bit dấu giữ nguyên là 1, các bit còn lại chuyển về 0, sau đó cộng thêm
1 bit), tao có kết quả:

1000 0000 0000 0000 0000 0000 0000 0001

Tương tự với trường hợp của ULONG_MAX:

%lu được dùng để biểu diễn giá trị của một số nguyên không dấu. Miền giá trị của số nguyên
không dấu 64-bit là 0 đến (264 - 1). Do đó, ULONG_MAX có giá trị là 264 - 1.

%ld được dùng để biểu diễn giá trị của một số nguyên có dấu. Hệ thống máy tính lưu trữ số
nguyên có dấu ở dạng bù 2 nên miền giá trị của số nguyên có dấu 64-bit là (-263) đến (263-1).

Khi biểu diễn dưới dạng nhị phân, ULONG_MAX là một dãy gồm 64 bit 1. Khi sử dụng %ld để
biểu diễn UINT_MAX, máy tính sẽ thực hiện phép tính bù 2 để đưa giá trị UNIT_MAX về số âm
-1. Cụ thể như sau:

1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111

Chuyển sang dạng bù 2 (bit dấu giữ nguyên là 1, các bit còn lại chuyển về 0, sau đó cộng thêm
1 bit), tao có kết quả:

1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001

2. Sự khác biệt trên có ý nghĩa như thế nào?

Khi biểu diễn dữ liệu cần phải lựa chọn các định dạng phù hợp với miền giá trị của kiểu dữ liệu
để tránh các sai sót trong tính toán. Đối với trường hợp của bài tập A, %d chỉ có thể biểu diễn
số nguyên nằm trong miền giá trị (-231) đến (231-1). Trong khi đó, UINT_MAX có giá trị là 232 - 1,
vượt quá khả năng biểu diễn của %d, dẫn đến hiện tượng tràn số nguyên (Integer Overflow).
Khi dùng %d, thay vì thể hiện đúng giá trị của UINT_MAX, máy tính sẽ thực hiện phép toán bù
2 để hiển thị kết quả là số âm -1. Điều tương tự xảy ra với trường hợp ULONG_MAX.

Bài B:

1. Ý tưởng chính của chương trình:


- Cho phép nhập một số nguyên không dấu 16-bit
- Khai báo mảng một chiều với số phần tử là 16 để lưu trữ các bit (giá trị mặc định của
các bit là 0)
- Kiểm tra giá trị của số nguyên không dấu có nằm trong miền giá trị phù hợp (từ 0 đến 216
- 1)
- Nếu số nguyên không thỏa điều kiện, báo lỗi “Tràn số nguyên”.
- Nếu số nguyên thỏa điều kiện, chạy vòng lặp để chuyển đổi sang dãy nhị phân. Cụ thể:
1. Thực hiện phép tính để lấy số dư sau khi chia cho 2
2. Dùng mảng một chiều để trữ số dư
3. Thực hiện phép tính để lấy thương sau khi chia cho 2, gán giá trị thương cho số
nguyên
4. Vòng lặp dừng khi giá trị số nguyên về 0
- Hiển thị dãy số nhị phân trên màn hình bằng cách in các phần tử trong mảng một chiều
theo thứ tự từ cuối lên đầu.

2. Mã nguồn chương trình (chụp màn hình)

Kết quả thực hiện chương trình:


Mã nguồn chương trình:

#include<stdio.h>

int main(void)
{
int a[16] = {0}; //Sử dụng mảng đa chiều để tạo một dãy nhị phân 16 bit 0
int x; //Số nguyên có dấu X cần chuyển sang hệ nhị phân
int i = 0;

printf("Nhap so nguyen X: ");


scanf("%d",&x);

if (x >= 0 && x < 65535) //Kiểm tra số nguyên có nằm trong miền giá trị

{
while ( x > 0)
{
a[i++] = x%2;
x = x/2;
}

printf("X duoi dang nhi phan: ");


for (i = 15; i >= 0; i--)
printf("%d",a[i]);
}

else
printf("Tran so nguyen");

return(0);
}

You might also like