Thông báo

Collapse
No announcement yet.

Giúp đỡ! Phân biệt các kiểu của biến

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Giúp đỡ! Phân biệt các kiểu của biến

    Mình mới tham gia diễn đàn. Minh muốn hỏi các bạn 1 tý.
    Mình có 2 đoạn code như sau:
    void delay(unsinged int time)
    {
    unsigned int i,j;
    for(i=1;i<=time;i++)
    {
    for(j=1;j<=125;j++)
    {}
    }
    }

    void delay(unsinged int time)
    {
    unsigned char i,j;
    for(i=1;i<=time;i++)
    {
    for(j=1;j<=125;j++)
    {}
    }
    }
    Mình soạn trên KeilC và dịch ra file .hex Khi đưa vào protues mô phỏng thì với cách khai báo unsigned char thì hàm delay sẽ chạy nhanh hơn (chạy sai) cách khai báo usigned int. Mình không biết tại sao? Và mình cũng chưa hiểu rõ về việc khai báo kiểu của biến trong lập trình 8051 sao cho hợp lí. Nhân đây mình muốn hỏi các bạn có sách nào dạy lập trình 8051 bằng C, C++ (tiếng Anh, Việt đều được) cơ bản mà hay giới thiệu cho mình. Mình học CNTT ngành CE, kỳ sau học vi xử lí nên rất cần! Cảm ơn các bạn
    |

  • #2
    unsigned char temp; khi đó biến temp chỉ nằm trong khoảng từ 0 -> 255, giá trị lớn nhất là 255, cho dù bạn có gán cho nó = 1000 thì nó chỉ nhận giá trị là 255 thôi => nhanh
    unsigned int temp; khi đó biến temp chỉ nằm trong khoảng từ 0 -> 65535
    như vậy khi gán 1000 thì nó sẽ nhận được giá trị 1000 (vì 1000<65535) => chạy đúng.

    Comment


    • #3
      Nguyên văn bởi Multi System Xem bài viết
      unsigned char temp; khi đó biến temp chỉ nằm trong khoảng từ 0 -> 255, giá trị lớn nhất là 255, cho dù bạn có gán cho nó = 1000 thì nó chỉ nhận giá trị là 255 thôi => nhanh
      unsigned int temp; khi đó biến temp chỉ nằm trong khoảng từ 0 -> 65535
      như vậy khi gán 1000 thì nó sẽ nhận được giá trị 1000 (vì 1000<65535) => chạy đúng.
      Khi gán nó bằng 1000 thì giá trị của nó sẽ là 235 chứ nhỉ?

      Comment


      • #4
        Nguyên văn bởi mrcuongcon Xem bài viết
        Khi gán nó bằng 1000 thì giá trị của nó sẽ là 235 chứ nhỉ?
        232

        mấy con số này đùa cho vui thôi khi gán từ số nguyên kích thước lớn sang số nguyên kích thước nhỏ thì
        kết quả ra bản thân nó đã không nên sử dụng rồi.

        Sông dài, Thuyền lớn, Biển rộng bao la.
        Tháo neo ngôn ngữ, lèo lái con thuyền kiến thức nhân loại.

        Comment


        • #5
          void display (unsigned int ms)
          {
          unsigned int i;
          unsigned int j;
          for(i = 0; i < ms; i++)
          {
          for(j = 0; j < 125; j++)
          {}
          }
          }
          ==> Chạy đúng
          void display (unsigned int ms)
          {
          unsigned int i;
          unsigned char j;
          for(i = 0; i < ms; i++)
          {
          for(j = 0; j < 125; j++)
          {}
          }
          }
          ==> Chạy sai! j chỉ chạy đến 124. Mình vừa thử xong. Và một số code nữa với kiểu unsigned char thì chay còn kiểu unsigned int thì ko chạy luôn!!!!
          |

          Comment


          • #6
            Đương nhiên là j chỉ chạy đến 124 rồi, vì điều kiện của nó là: chạy từ 0 đến < 125 mà(j=0;j<125;j++), do đó ko thể chạy đến 125 được

            Comment


            • #7
              Nguyên văn bởi Multi System Xem bài viết
              Đương nhiên là j chỉ chạy đến 124 rồi, vì điều kiện của nó là: chạy từ 0 đến < 125 mà(j=0;j<125;j++), do đó ko thể chạy đến 125 được
              Mình biết. Ý của mình là j đâu chạy đến 255 đâu nhưng vẫn sai đấy thôi. Theo mình nghĩ nên khai báo các kiểu đồng nhất.
              |

              Comment


              • #8
                Nguyên văn bởi quoc_thaibk Xem bài viết
                232

                mấy con số này đùa cho vui thôi khi gán từ số nguyên kích thước lớn sang số nguyên kích thước nhỏ thì
                kết quả ra bản thân nó đã không nên sử dụng rồi.
                Có lẽ ý kiến này mình cho là hợp lí. Mọi người giải thích giúp mình nha. Chứ mình thì rồi
                |

                Comment


                • #9
                  Nguyên văn bởi hai_lua_t2 Xem bài viết
                  void display (unsigned int ms)
                  {
                  unsigned int i;
                  unsigned int j;
                  for(i = 0; i < ms; i++)
                  {
                  for(j = 0; j < 125; j++)
                  {}
                  }
                  }
                  ==> Chạy đúng
                  void display (unsigned int ms)
                  {
                  unsigned int i;
                  unsigned char j;
                  for(i = 0; i < ms; i++)
                  {
                  for(j = 0; j < 125; j++)
                  {}
                  }
                  }
                  ==> Chạy sai! j chỉ chạy đến 124. Mình vừa thử xong. Và một số code nữa với kiểu unsigned char thì chay còn kiểu unsigned int thì ko chạy luôn!!!!
                  Mình thấy cả 2 cách đều đúng, chỉ có điều bạn chưa biết cách "nói" cho trình biên dịch nó hiểu theo ý đồ của bạn thôi. Kiểu unisigned char thì vdk dùng 1 byte RAM để tính toán, còn kiểu unsigned int thì là 2 byte nên tất nhiên việc xử lí tốn kém các dòng lệnh hơn => thời gian chạy trì hoãn sẽ lâu hơn. Nếu muốn trì hoãn 1 thời gian cố định là ms thì phải điều chỉnh giá trị lớn nhất mà j chạy đến, bạn mà cố định j(max)=125 thì làm sao ra đúng được ms? Làm nhiều bạn sẽ biết là nên dùng hàm có j kiểu unsigned char, khi thử dần j lên đến 255 mà vẫn chưa đạt được giá trị trì hoãn 1ms (theo vòng lặp i) thì khi đó mới dùng biến j kiểu unsigned int.
                  Dùng các vòng lặp (for, while) để trì hoãn xem ra o hay bằng dùng lệnh if và goto - đơn giản, dễ dàng, có khi o cần mô phỏng làm gì.
                  !e

                  Comment

                  Về tác giả

                  Collapse

                  hai_lua_t2 Tìm hiểu thêm về hai_lua_t2

                  Bài viết mới nhất

                  Collapse

                  Đang tải...
                  X