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

                  • bqviet
                    Trả lời cho Đấu tắt điện cho máy tính bảng
                    bởi bqviet
                    Bqv cáo lỗi vì chưa đủ khả năng diễn giải để người đọc hiểu. Người làm kỹ thuật sâu đôi khi như thế đó. Về việc nạp pin không vào dù cell mới, khả năng cái mạch quản lý đó đã hỏng - cũng chính là nguyên nhân đám cell cũ hỏng từ đầu.
                    06-12-2025, 17:17
                  • nguyendinhvan
                    Trả lời cho Xin hỏi về mạch thu FM/AM trong catsette
                    bởi nguyendinhvan
                    Theo tôi, nó chỉ là cái Tuy- ê - nơ, hoặc là khối Trung Văn Tần, nó một phần trong cái Da đì ô thôi. Vì có thấy một chỗ có ba chân hàn, giiống như chân Cờ rít sờ tăng 455 ki nô hẹc. Còn khối Tuy ê nơ thì không nhìn thây cái Di ốt Va di cáp...
                    05-12-2025, 19:59
                  • afrendly
                    Trả lời cho Đấu tắt điện cho máy tính bảng
                    bởi afrendly
                    Có vẻ ngoài hiểu biết của mình rồi. Cuối cùng mình quyết định tìm mua 2 pin trên Shopee, giá 200K thay vào. Tuy nhận pin được 1%, sạc mãi không vào nhưng cũng mở được máy lên. Vậy cũng tạm. Cảm ơn bạn đã hỗ trợ nhé....
                    04-12-2025, 01:27
                  • nick22
                    Trả lời cho Máy điện châm ?
                    bởi nick22
                    Đúng như bạn nói, máy điện châm hiện nay trên thị trường đã khá đa dạng về mẫu mã, chức năng và giá thành.
                    01-12-2025, 13:23
                  Đang tải...
                  X