1.Biến và hằng số:
Biến để lưu trữ một giá giá trị mà giá trị có thể thay đổi, hằng số là một giá trị cố định . Biến và hằng với nhiều loại và và chiếm kích thước vùng nhớ khác nhau. Bài này chúng ta cùng đi tìm hiểu các kiểu biến và hằng.
1.1 Kiểu biến:
Biến và hằng số được lưu trữ bên trong bộ nhớ có giới hạn của vi điều khiển, và chương trình biên dịch cần biết số lượng bộ nhớ cần để cấp cho mỗi biến mà không làm lãng phí không gian bộ nhớ một cách không cần thiết. Do vậy người lập trình cần phải khai báo biến, chỉ định cả hai thông số đó là kích cỡ và kiểu dữ liệu cần lưu trữ. Điều quan trọng là hiểu được kích cỡ của mỗi kiễu dữ liệu của chương trình biên dịch mà bạn đang sử dụng bởi vì không phải tất cả các chương trình biên dịch quy định kích cỡ của kiểu biến giống nhau.
Các kiểu biến mặt định trong chương trình CCS
Kiểu | Kích cỡ | Unsigned (Không dấu) | Signed (Có dấu) |
int1 | Số 1 bit = true hay false ( 0 hay 1) | 0 đến 1 | Không có |
int8 | Số nguyên 1 byte ( 8 bit) |
0 đến 255
| -128 đến 127 |
int16 | Số nguyên 16 bit | 0 đến 65535 | -32768 đến 32767 |
int32 | Số nguyên 32 bit | 0 đến 4294967295 | -2147483648 đến 2147483647 |
int48 | Số nguyên 48 bit |
0 đến
281474976710655
|
-140737488355328 đến
140737488355327
|
int64 | Số nguyên 64 bit | Không Có | -9223372036854775808 đến
9223372036854775807
|
float32 | Số thực 32 bit | -1.5 x 1045 đến 3.4 x 1038 |
Bảng tương ứng giữa kiểu biến tiêu chuẩn của C với kiểu mặt định của trình biên dịch CCS
Kiểu tiêu chuẩn của C | Kiểu mặt định của trình biên dịch CCS |
short | int1 |
char | unsigned int8 |
int | int8 |
long | int16 |
long long | int32 |
float | float32 |
double | Không có |
Theo mặt định của chương trình biên dịch , kiểu short là 1 bit, int là 8 bit, long là 16 bit. Ta muốn thay đổi kích thước bằng lệnh tiền xữ lý #TYPE
Ví dụ: #TYPE SHORT=8, INT=16, LONG=32
1.2 Phạm vi biến (Variable scope)
Biến cục bộ: Là biến trong phạm vi một hàm và chỉ có thể được sử dụng trong hàm ấy. Biến cục bộ không có hiệu lực ở ngoài phạm vi của hàm mà ở đó nó được khai báo và sẽ được giải phóng khi kết thúc hàm.
Biến toàn cục: Là biến được khai báo ở ngoài tất cả các hàm và có thể được sử dụng ở phạm vi toàn bộ chương trình. Biến này có hiệu lực ở tất cả các hàm trong chương trình và thường được khai báo ở đầu chương trình. Biến toàn cục lưu giữ giá trị của nó trong suốt thời gian chương trình được thực thi.
Ví dụ biến cục bộ và biến toàn cục:
unsigned char globey; // biến toàn cục void function_z( void) // đây là một hàm có thể được gọi từ hàm main { unsigned int tween; // biến cục bộ của hàm function_z tween=12; // hợp lệ bởi vì nó sử dụng trong hàm mà nó được khai báo globey =47;// hợp lệ bởi vì đây là biến toàn cục main_loc = 12; // không hợp lệ và tạo ra một lỗi vì nó là biến cục bộ của hàm main } void main() { unsined char main_loc; // khai báo biến cục bộ của hàm main globey = 34; // hợp lệ bởi vì đây là biến toàn cục tween = 12; // không hợp lệ và tạo ra một lỗi vì nó là biến cục bộ của hàm function_z while(1); } |
1.3 Hằng số (Constants)
Hằng số là biến có giá trị không thay đổi trong suốt quá trình thực thi chương trình. Hằng số có thể mang các kiểu dữ liệu khác nhau như số nguyên, số thực, kiểu ký tự hay luận lý, con trỏ, vân vân... như các biến thông thường ngoại trừ giá trị của chúng không thể biến đổi sau khi được định nghĩa.
Số nguyên
Số nguyên có thể được định nghĩa là số thập phân, số cơ số 8 (octal) hay cơ số 16 (hexa). Số thập phân được biểu diễn như cách chúng ta dùng hằng ngày, số cơ số 8 được bắt đầu bằng ký tự 0 (zero) và số cơ số 16 được bắt đầu bằng 0x. Cũng tương tự như các biến kiểu nguyên, các giá trị hằng số mặc định là kiểu integer (int), có thể định nghĩa chúng theo kiểu long hay unsigned bằng cách thêm vào phía sau giá trị các ký tự u hoặc U (unsigned), l hoặc L (long). Ví dụ:
53 // decimal, int
0357 // octal
0xa2c // hexadecimal
789u // unsigned int
2512l // long
82ul // unsigned long
34lU // unsigned long
Các ký tự u và l có thể viết in hoặc thường.
Số thực
Số thực có thể được biểu diễn bằng dấu thập phân (dấu chấm), dùng chữ e hoặc cả hai. Kiểu mặc định của số thực là double, tuy nhiên số thực có thể được khai báo theo kiểu float hoặc long double bằng các ký tự f hoặc F, l hoặc L ở phía sau giá trị. Ví dụ:
5.23 // double
3.23e8 // 3.23 x 10^8
6.75e-5f // float, 6.75 x 10^-5
6.75e-5L // long double, 6.75 x 10^-5
Ký tự và chuỗi
Ký tự được biểu diễn bằng dấu nháy đơn ('a') bao quanh một ký tự trong khi đó chuỗi được biểu diễn bằng dấu nháy đôi ("chuỗi ký tự"). Ký tự và chuỗi cũng có thể biểu diễn các ký tự đặc biệt như sang dòng mới (\n) hoặc tab (\t). Những ký tự đặc biệt này được mở đầu bằng dấu gạch chéo ngược (\).
Mã gạch chéo ngược | Ý nghĩa |
---|---|
\n | newline, dòng mới |
\r | carriage return, trở về |
\t | tab ngang |
\v | tab dọc |
\b | backspace, xóa lùi |
\f | form feed (page feed) |
\a | alert (beep) |
\' | single quote (' ) |
\" | double quote (" ) |
\? | question mark (? ) |
\\ | backslash (\ ) |
Khai báo hằng số
Hằng số có thể được khai báo bằng hai cách, dùng const phía trước câu lệnh khai báo biến thông thường hoặc định nghĩa tiền xử lý (#define) theo cú pháp #define <tên> <giá trị>
ví dụ:
#include <pic16f877a.h> #define PI 3.14159 void main(void) {
const double bankinh = 7.0;
while(1);double chuvi; chuvi = 2 * PI * bankinh; } |
- Biến PI là hằng số và được định nghĩa bằng #define. Tiền xử lý #define nằm ở vị trí đầu chương trình nhằm định nghĩa các giá trị hằng số.
- Biến bankinh là biến cục bộ kiểu số thực được định nghĩa bằng const trong hàm main()
Lưu ý rằng ở cuối câu lệnh định nghĩa tiền xử lý #define không có dấu chấm phẩy (;).
1.3 Phân lớp lưu trữ :
Biến có thể khai báo trong ba phân lớp lưu trữ: auto, static, và register. Auto, hoặc automatic là phân lớp mặt định, do vậy khi khai báo
int value_1 ;
hoặc
auto int value_1;
Là giống nhau
Automatic:
Một biến cục bộ phân lớp automatic không được khởi tạo giá trị ban đầu khi cấp phát bộ nhớ, vì vậy người lập trình nên đảm bảo dữ liệu có giá trị trước khi sử dụng. Vùng không gian bộ nhớ sẻ được giải phóng khi thoát khỏi hàm, nghĩa là giá trị sẽ bị mất và khi quay trở lại hàm thì giá trị đó không tồn tại. Biến lớp automatic được khai báo như phía dưới
auto int value_1;
hoặc
int value_1 ;
Static:
Một biến cục bộ static chỉ có phạm vị trong hàm mà nó định ngĩa (không thể truy xuất từ các hàm khác), nhưng nó được cấp phát trong vùng nhớ toàn cục. Biến static được khởi tạo giá trị ban đầu bằng 0 khi lần đầu tiên hàm được gọi, và và giá trị lưu trong biến không mất đi khi thoát khỏi hàm. Và ta có thể sử dụng giá trị này mỗi khi hàm được gọi lại.
static int value_2;
Register:
Biến cục bộ register gần giống như biến automatic. Sự khác biệt đó là chương trình biên dịch sẽ sử dụng thanh ghi của vi điều khiển như là một biến để giảm số chu kỳ máy yêu cầu khi truy cập biến. Có rất ít thanh ghi khi so sánh với bộ nhớ tổng trong một máy điển hình. Do vậy phân lớp này sử dụng một cách tiết kiệm . Trong chương trình biến dịch CCS không hỗ trợ phân lớp này nhưng vẫn có thể khai báo.
1.3 Ép kiểu (Type casting)
Bạn có thể ép kiểu , thường là tiết kiệm ram , hay muốn tiết kiệm thời gian tính , . . ..
VD :
Int8 a =8 , b=200;
Int16 c ;
C= ( int16) a * b ; // c= 1600 , a chuyển sang 16 bit , 16bit*8bit tự động chuyển sang 16 bit , kết quả là 16 bit trong c , lưu ý biến a , b vẫn là 8 bit .
Int8 a =8 , b=200;
Int16 c ;
C= ( int16) a * b ; // c= 1600 , a chuyển sang 16 bit , 16bit*8bit tự động chuyển sang 16 bit , kết quả là 16 bit trong c , lưu ý biến a , b vẫn là 8 bit .
8bit * 8bit -> phép nhân là 8 bit , KQ là 8 bit
16bit * 8 bit -> phép nhân là 16 bit , KQ là 16 bit
32bit * 16 bit -> phép nhân là 32 bit , KQ là 32 bit
16bit * 16 bit -> phép nhân là 16 bit , KQ là 16 bit
. . . v . v . . .
Có thể ép kiểu kết quả : VD : 16b * 8b ->16bit , nếu gán vào biến 8 bit thì KQ sẽ cắt bỏ 8 bit cao .
Không có nhận xét nào:
Đăng nhận xét