1. So sánh hệ thống Big Endian và Litle Edian 
    - Big Endian: Byte cao nhất sẽ được sắp đầu tiên tức (nếu hàng ngang thì) xếp phía bên trái ngoài cùng. Liên hệ slide 45
    - Litle Edian: Byte thấp nhất sẽ đc sắp đầu tiên tức (nếu hàng ngang thì) xếp phía bên trái ngoài cùng.

   - Các hệ thống dùng vi xử của intel thì dùng nền tảng little endian,và đa số đều vậy
   -
Các hệ thống dùng chip của solaris, motorola thì dùng big endian
  Ví dụ:
                                    --Byte cao nhất--  ------------   ------------   --byte thấp nhất--
                       số 123456  =   00000000 00000001 11100010 01000000
Số 123456 lần lượt được lưu trong hệ thống Big Endian và Little Endian dưới đây:
             ______________________________________________________
             Trong Big Endian : 00000000 00000001 11100010 01000000
              Little Endian :       01000000 11100010 00000001 00000000

2. Để xác định hệ thống dùng cách lưu gì ta dùng đoạn mã sau để xác định:
#include <iostream>

using namespace std;

void main()
{
      int i = 0x12345678;
      char *p;
      p = (char*) &i;

      if (*p == 0x78){
            printf("Little endian\n");
      } else {
            printf("Big endian\n");
      }
      system("pause");
}

3. Ví dụ:

4. Một số câu hỏi: 
    Viết hàm Swap Endian của số int x đưa vào. Ví dụ: int x = 0xA0B0C0D0 
       --> Kết quả:  Endian_Swap(int x) = 0xD0C0B0A0


#include <iostream>
using namespace std;

int Endian_Swap(int x);//4byte

void main()
{
      int x = 0xA0B0C0D0;
      printf("Endian_Swap 0x%X\n", Endian_Swap(x));
      //output: 0xDOC0B0A0
      system("pause");
}

int Endian_Swap(int x)
{
     return (
              ((x >> 24) & 0x000000FF) |
              ((x >> 8)  & 0x0000FF00) |
              ((x << 8)  & 0x00FF0000) |
              ((x << 24) & 0xFF000000)
              );
}


static_cast: chuyển kiểu dữ liệu bình thường như int -> char,...
dynamic_cast: chuyển đổi kiểu con trỏ (hoặc kiểu tham chiếu) giữa các lớp đa hình trong đa kế thừa.
reinterpret_cast: chuyển đổi giữa 2 kiểu dữ liệu ko có mối liên hệ, vd như là int -> pointer,...
const_cast: bỏ const ra khỏi dữ liệu được chuyển đổi.
1. Khái niệm:
    - Xét hàm Max(x, y) để tính max của 2 đối số x, y. Nếu không sử dụng khuôn hình hàm thì với mỗi kiểu dữ liệu của x, y (int, float, long, ...) thì ta phải xây dựng một hàm Max riêng.
   -  Dùng khuôn hình hàm, ta có thể định nghĩa một mẫu cho một họ các hàm tương ứng, bằng cách thay kểu dữ liệu như một tham số.

2. Ví dụ khuôn hình hàm:
    Tìm max của hai số:
#include <iostream>

using namespace std;
template <class T> T GetMax(T a, T b)
{
      return (a > b ? a : b);
}

void main()
{
      int n = 10, m = 20;
      cout << "Max = " << GetMax<int>(n, m) << endl;
      float x = 1.5f, y = 2.5f;
      cout << "Max = " << GetMax<float>(x, y) << endl;
      getchar();
}



#include <iostream>

using namespace std;

template <class U, class V> U GetMax(U a, V b)
{
      return (a > b ? a : b);
}

void main()
{
      float n = 10.5f; int m = 12;
      cout << "Max = " << GetMax<float, int>(n, m) << endl;
      cout << "Max = " << GetMax<float>(10.5, 12.5) << endl;
      getchar();
}

  Ví dụ hàm tính tổng hai số:
#include <iostream>

using namespace std;

template <class T> T Add(T a, T b)
{
      return a + b;
}

void main()
{
      int n = 10, m = 20;
      cout << "Add = " << Add<int>(n, m) << endl;
      getchar();
}

3. Ví dụ khuôn hình lớp:
#include <iostream>

using namespace std;

template <class T>
class MyPair
{
private:
      T a, b;//Tạo class MyPair có các biến thành phần kiểu T
public:
      MyPair(T first, T second)
      {
            a = first;
            b = second;
      }
      //Hàm Print() in giá trị của các biến a và b
      void Print()
      {
            cout << "First = " << a << ", Second = "<< b << endl;
      }
      T GetMax();
};

template <class T> T MyPair<T>::GetMax()//Cài đặt hàm GetMax
{
      return a > b ? a : b;
}
void main()
{
      MyPair<int> pair1(100, 200);
      pair1.Print();
      cout << "Max: " << pair1.GetMax() << endl;
     
      MyPair<char> pair2('A', 'B');
      pair2.Print();
      cout << "Max: " << pair2.GetMax() << endl;

      getchar();
}


 Ví dụ khuôn hình lớp:


. Vdfafsfsa
Ví dụ 1: Đối với các phép toán phân số: cộng, trừ, nhân, chia hai phân số
               PS pstong = Cong(p, q);//Dùng hàm làm tính toán không được tự nhiên và dài dòng
               --> Ở ví dụ 2 dùng chồng toán tử nên cách viết đơn giản hơn:
       PS pstong = p + q;//Cách ghi đơn giản hoa



#include <iostream>
using namespace std;

struct PS
{
      int a, b;
};

void NhapPhanSo(PS *p);
void InPhanSo(PS p);
int USCLN(int x, int y);
PS RutGon(PS p);
PS Cong(PS p1, PS p2);
PS Nhan(PS p1, PS p2);
PS Chia(PS p1, PS p2);

void NhapPhanSo(PS *p)
{
      int t, m;
      printf("\nTu va mau:");
      scanf_s("%d%d", &t, &m);
      p->a = t;
      p->b = m;
}

void InPhanSo(PS p)
{
      printf("\n%d/%d",p.a, p.b);
}
int USCLN(int x, int y){
      x = abs(x);
      y = abs(y);
      //if( x * y == 0) return 1;
      while( x != y)
      {
            if( x > y) {
                  x -= y;
            }
            else {
                  y -= x;
            }
      }
      return x;
}

PS RutGon(PS p)
{
      PS q;
      int x = USCLN(p.a, p.b);
      q.a = p.a/x;
      q.b = p.b/x;
      return q;
}
PS Cong(PS p1, PS p2)
{
      PS q;
      q.a = p1.a * p2.b + p1.b * p2.a;
      q.b = p1.b * p2.b;
      return RutGon(q);
}
PS Nhan(PS p1, PS p2)
{
      PS q;
      q.a = p1.a * p2.a;
      q.b = p1.b * p2.b;
      return RutGon(q);
}
PS Chia(PS p1, PS p2)
{
      PS q;
      q.a = p1.a * p2.b;
      q.b = p1.b * p2.a;
      return RutGon(q);
}

void main()
{
      PS p, q, pstong;
      printf("\nNhap phan so p:");
      NhapPhanSo(&p);
      printf("\nNhap phan so q:");
      NhapPhanSo(&q);
      pstong = Cong(p, q);// Dùng hàm làm tính toán không được tự nhiên và dài dòng
                          // Ta sẽ dùng Operator để cài đặt lại các phép toán
      InPhanSo(pstong);
      getchar();
      getchar();
}



Ví dụ 2: Sử dụng chồng toán tử đối với các phép toán trên phân số:
#include <iostream>
using namespace std;

struct PS
{
      int a, b;
};

void NhapPhanSo(PS *p);
void InPhanSo(PS p);
int USCLN(int x, int y);
PS RutGon(PS p);
PS operator+(PS p1, PS p2);//p1 + p2
PS operator-(PS p1, PS p2);//p1 - p2
PS operator*(PS p1, PS p2);//p1 * p2
PS operator/(PS p1, PS p2);//p1 / p2

void NhapPhanSo(PS *p)
{
      int t, m;
      printf("\nTu va mau:");
      scanf_s("%d%d", &t, &m);
      p->a = t;
      p->b = m;
}

void InPhanSo(PS p)
{
      printf("\n%d/%d",p.a, p.b);
}
int USCLN(int x, int y){
      x = abs(x);
      y = abs(y);
      //if( x * y == 0) return 1;
      while( x != y)
      {
            if( x > y) {
                  x -= y;
            }
            else {
                  y -= x;
            }
      }
      return x;
}

PS RutGon(PS p)
{
      PS q;
      int x = USCLN(p.a, p.b);
      q.a = p.a/x;
      q.b = p.b/x;
      return q;
}
PS operator+(PS p1, PS p2)//p1 + p2
{
      PS q;
      q.a = p1.a * p2.b + p1.b * p2.a;
      q.b = p1.b * p2.b;
      return RutGon(q);
}
PS operator-(PS p1, PS p2)//p1 - p2
{
      PS q;
      q.a = p1.a * p2.b - p1.b * p2.a;
      q.b = p1.b * p2.b;
      return RutGon(q);
}
PS operator*(PS p1, PS p2)//p1 * p2
{
      PS q;
      q.a = p1.a * p2.a;
      q.b = p1.b * p2.b;
      return RutGon(q);
}
PS operator/(PS p1, PS p2)//p1 / p2
{
      PS q;
      q.a = p1.a * p2.b;
      q.b = p1.b * p2.a;
      return RutGon(q);
}

void main()
{
      PS p, q, psTong, psTich;
      printf("\nNhap phan so p:");
      NhapPhanSo(&p);
      printf("\nNhap phan so q:");
      NhapPhanSo(&q);
      psTong = p + q;//Dùng Operator để cài đặt lại các phép toán
      InPhanSo(psTong);
      psTich = p * q;
      InPhanSo(psTich);
      getchar();
      getchar();
}

Xem them vi du o day: http://www.cplusplus.com/doc/tutorial/templates/
Ví dụ 3: nhân hai ma trận
Két luận: