Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 12 kết quả

Đề tài: hỏi về cách xử lí kiểu int 64 bits

  1. #1
    Ngày gia nhập
    05 2008
    Nơi ở
    Tp.Hcm
    Bài viết
    2

    Question hỏi về cách xử lí kiểu int 64 bits

    Các bạn cho mình hỏi :

    1. khi mình dùng kiểu long tức là 32 bits, tại sao mình chỉ truy xuất dc giá trị max là 2^31, còn 2^32 thì mình truy xuất là nó báo fail. (nghe nói 1 bit dùng cho dấu, nhưng mình đã khai báo là unsigned long rồi)
    2. có cách nào xử lí với số integer 64 bits không?

    Cám ơn các bạn nhiều.

  2. #2
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất nhiều sóng gió
    Bài viết
    483

    Trích dẫn Nguyên bản được gửi bởi tnphongvn Xem bài viết
    Các bạn cho mình hỏi :

    1. khi mình dùng kiểu long tức là 32 bits, tại sao mình chỉ truy xuất dc giá trị max là 2^31, còn 2^32 thì mình truy xuất là nó báo fail. (nghe nói 1 bit dùng cho dấu, nhưng mình đã khai báo là unsigned long rồi)
    Kiểu long và kiểu unsigned long là 2 kiểu khác nhau. Không thể dùng nhập nhằng như thế được.


    Trích dẫn Nguyên bản được gửi bởi tnphongvn Xem bài viết
    2. có cách nào xử lí với số integer 64 bits không?
    Còn tùy theo cái "nó báo fail" ấy là cái gì.

  3. #3
    Ngày gia nhập
    05 2008
    Nơi ở
    Tp.Hcm
    Bài viết
    2

    Mình có thể nói sơ về khúc code của mình, vì mình không thể send nguyên 1 project lên đây được, các bác thông cảm

    Define các kiểu dữ liệu :

    PHP Code:
    typedef signed char int8_t;
    typedef short int16_t;
    typedef long int32_t;
    typedef unsigned char uint8_t;
    typedef unsigned short uint16_t;
    typedef unsigned long uint32_t;
    typedef __int64  int64_t
    Khai báo 1 mảng cấu trúc

    PHP Code:
    /*Define Struct*/
    typedef struct {
        
    uint32_t    syntax;
        
    int64_t     maxValue;
        
    int64_t     minValue;
        
    uint16_t    access;
        
    uint16_t    status;
        
    uint16_t    Buffsize;
        
    uint16_t    strLen;
        
    void        *data;

    Table_s;

    Table_s MMT[LISTMAX]; 
    nó báo Fail ngay đây khi không so sánh được 2 số cùng kiểu int64_t

    PHP Code:
    /*Set Value must be between Min and Max value*/
            
    else if ((MMT[aCode].minValue > *((int64_t *)aBuf))
                    ||(
    MMT[aCode].maxValue < *((int64_t *)aBuf)))
            {
                
    printf("FAIL HERE\n");
                return 
    FAIL;
            } 
    aCode là index, aBuf là 1 con trỏ (int8_t *aBuf), mình ép kiểu và lấy giá trị để so sánh.

    Nếu mình define int64_t là long thì chạy đúng nha mấy bạn
    Các bạn coi giúp mình tại sao.
    Thanks all.
    Đã được chỉnh sửa lần cuối bởi tnphongvn : 28-05-2008 lúc 11:23 AM.

  4. #4
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất nhiều sóng gió
    Bài viết
    483

    Mình vẫn không hiểu thế nào là "chạy đúng" thế nào là "chạy sai" theo ý của bạn. (Nói riêng, mình nghĩ rằng chẳng có lí do gì bắt code phải báo hay không báo FAIL trong mọi trường hợp. Lúc này FAIL, lúc khác không FAIL thì có gì lạ đâu.) Code của bạn không dịch được nên cũng không giúp mình hiểu thêm. Bạn không cần post nguyên cả 1 project. Chỉ cần post 1 hoặc 2 chương trình rất ngắn, nhưng đầy đủ, dịch được và chạy được, để minh họa cho vấn đề của bạn, và giải thích theo bạn nghĩ thì đúng ra các chương trình ấy phải chạy thế nào.

    Luôn tiện, mình lưu ý bạn rằng bạn đang dùng một trình biên dịch không chuẩn (MS VC++) và các kiểu không chuẩn chỉ được hỗ trợ bởi trình biên dịch này.

  5. #5
    Ngày gia nhập
    05 2008
    Nơi ở
    Tp.Hcm
    Bài viết
    2

    Trích dẫn Nguyên bản được gửi bởi Ada Xem bài viết
    Mình vẫn không hiểu thế nào là "chạy đúng" thế nào là "chạy sai" theo ý của bạn. (Nói riêng, mình nghĩ rằng chẳng có lí do gì bắt code phải báo hay không báo FAIL trong mọi trường hợp. Lúc này FAIL, lúc khác không FAIL thì có gì lạ đâu.) Code của bạn không dịch được nên cũng không giúp mình hiểu thêm. Bạn không cần post nguyên cả 1 project. Chỉ cần post 1 hoặc 2 chương trình rất ngắn, nhưng đầy đủ, dịch được và chạy được, để minh họa cho vấn đề của bạn, và giải thích theo bạn nghĩ thì đúng ra các chương trình ấy phải chạy thế nào.
    Cám ơn bạn đã quan tâm. Mình xin giải thích rõ cái mục đích của cái nạm mình post lên đấy cho Ada nhé :

    1 phần tử của mảng là 1 struct, nó có giá trị data, minValue, minValue, ...
    minValue và maxValue được define theo kiểu int65_t (__int64), còn data thì lại là kiểu số nguyên thường (int32_t), nhưng khi mình muốn ịn 1 giá trị aBuf nào đó cho data mình phải check coi nó có nằm trong khoảng minValue < aBuf < maxValue
    , và đến đây thì nó fail, mặc dù giá trị các min, Max, aBuf vẫn thỏa mãn điều kiện trên. Tức là minValue < aBuf < maxValue nhưng vì min, max kiểu __int64 nên nó so sánh cho kết quả không như mong muốn.

    Giải thích thêm về "chạy đúng" và "chạy sai" cho Ada :

    một struct có muốn có giá trị như sau :
    - syntax = ....
    - maxValue = 10
    - minValue = 2
    - data = 5
    - ....

    (mình không quan tâm tới cái field khác, chỉ nói tới max, min và data)

    chạy đúng :
    define int64_t là long, thì sẽ không nhảy vào đoạn code so sánh trên (vì 2 < 5 < 10)

    chạy sai :
    define int64_t là __int64, mặc dù 2 < 5 < 10 nhưng khúc code sánh lại trả về TRUE và nó nhảy vào thực hiện nhưng thao tác bên trong đoạn if đó
    Trích dẫn Nguyên bản được gửi bởi Ada Xem bài viết
    Luôn tiện, mình lưu ý bạn rằng bạn đang dùng một trình biên dịch không chuẩn (MS VC++) và các kiểu không chuẩn chỉ được hỗ trợ bởi trình biên dịch này.
    Bạn có thể nói rõ hơn phần này cho mình được không, tại sao MS VC++ lại là trình biên dịch không chuẩn?

    --------------------------

    Xin lỗi Ada vì bài viết phía trên của mình không được rõ ràng
    Đã được chỉnh sửa lần cuối bởi tnphongvn : 28-05-2008 lúc 01:20 PM.

  6. #6
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Mặc định hỏi về cách xử lí kiểu int 64 bits

    Trích dẫn Nguyên bản được gửi bởi tnphongvn Xem bài viết
    Bạn có thể nói rõ hơn phần này cho mình được không, tại sao MS VC++ lại là trình biên dịch không chuẩn?
    đọc lịch sử C/C++ sẽ biết thế nào là chuẩn với không chuẩn
    None!

  7. #7
    Ngày gia nhập
    05 2008
    Nơi ở
    Tp.Hcm
    Bài viết
    2

    Trích dẫn Nguyên bản được gửi bởi Xcross87 Xem bài viết
    đọc lịch sử C/C++ sẽ biết thế nào là chuẩn với không chuẩn
    Cám ơn, sẽ đọc

  8. #8
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất nhiều sóng gió
    Bài viết
    483

    Trích dẫn Nguyên bản được gửi bởi tnphongvn Xem bài viết
    Cám ơn bạn đã quan tâm. Mình xin giải thích rõ cái mục đích của cái nạm mình post lên đấy cho Ada nhé :

    1 phần tử của mảng là 1 struct, nó có giá trị data, minValue, minValue, ...
    minValue và maxValue được define theo kiểu int65_t (__int64), còn data thì lại là kiểu số nguyên thường (int32_t), nhưng khi mình muốn ịn 1 giá trị aBuf nào đó cho data mình phải check coi nó có nằm trong khoảng minValue < aBuf < maxValue
    , và đến đây thì nó fail, mặc dù giá trị các min, Max, aBuf vẫn thỏa mãn điều kiện trên. Tức là minValue < aBuf < maxValue nhưng vì min, max kiểu __int64 nên nó so sánh cho kết quả không như mong muốn.
    Mình hiểu rồi. Vấn đề nằm ở 2 câu mình tô đậm ấy.

    "Data là kiểu số nguyên thường (int32_t)" và bạn muốn "ịn 1 giá trị aBuf nào đó cho data" => aBuf của bạn cũng chứa dữ liệu cùng định dạng như data, tức các số nguyên 32 bít, đúng không.

    Vì thế biểu thức

    Code:
     *((int64_t *)aBuf))
    sẽ lấy hai số nguyên 32 bit nằm cạnh nhau trong aBuf ghép lại thành một số nguyên 64 bit. Kết quả như thế nào thì bạn biết rồi đấy.

    Trích dẫn Nguyên bản được gửi bởi tnphongvn Xem bài viết
    Bạn có thể nói rõ hơn phần này cho mình được không, tại sao MS VC++ lại là trình biên dịch không chuẩn?
    À í mình nói là compiler C++ nào phát triển trước khi có chuẩn cũng tùy tiện đưa vào trong ngôn ngữ các cú pháp và ngữ nghĩa riêng mà sau này vẫn phải hỗ trợ chúng như một tính năng không chuẩn. Từ khóa (và kiểu) __int64 không phải là của C/C++ chuẩn mà là một trong có các tính năng riêng chỉ được định nghĩa bởi MS VC++. Nghe đâu MS VC++ có rất nhiều tính năng như thế (nhiều hơn các compiler C++ khác) nên người ta thường gọi nó là một compiler không chuẩn (phi chuẩn). Mã nguồn "không chuẩn" chưa chắc đã là "không tốt" mà chỉ đơn giản là "bị hạn chế về khả năng dùng rộng rãi". Compiler "không chuẩn" chưa chắc đã là "không tốt" mà chỉ đơn giản là "có thể dẫn đến mã nguồn không chuẩn". Bài của bạn gửi trong khu vực thảo luận về C/C++ chuẩn nên mình nhắc để bạn chú í điểm này thôi.
    Đã được chỉnh sửa lần cuối bởi Ada : 28-05-2008 lúc 01:31 PM.

  9. #9
    Ngày gia nhập
    05 2008
    Nơi ở
    Tp.Hcm
    Bài viết
    2

    @Ada : thanks Ada nhiều, nhưng có một điều, là hiện tại mình thực thi 1 phần nhỏ của một project, sẽ được nhúng trên linux, nhưng hiện tại vẫn compile trên .NET 2005, nên những cái __int64 chỉ define để compile trên Win .NET thôi, chứ sau khi hoàn thiện thì phải lược lại những phần đó

    Đó là lí do tại sao sinh ra cái nạm này (sau này chỉ sửa cho nguyên project trong khúc này thôi)
    PHP Code:
    typedef signed char int8_t;
    typedef short int16_t;
    typedef long int32_t;
    typedef unsigned char uint8_t;
    typedef unsigned short uint16_t;
    typedef unsigned long uint32_t;
    typedef __int64  int64_t

  10. #10
    Ngày gia nhập
    11 2006
    Bài viết
    75

    Dùng Boost.Integer nếu bác cần làm việc trên nhiều compiler/platform. Nó sẽ resolve giùm bác những phiền toái có thể gặp phải do sự khác nhau giữa các compiler/platform... (mscv/win, gcc/linux, gcc/hp-ux, gcc/bsd, bcc/win ....) & sẽ không phải chỉnh lại code khi bác chạy sô từ cái nọ sang cái kia.

    Tất nhiên là nếu có compiler/platform nào mới ra mà thằng này chưa kịp support thì bác vẫn phải chỉnh lại = tay.

    #include <boost/cstdint.hpp>

    using boost::uint8_t;
    using boost::uint16_t;
    using boost::uint32_t;
    using boost::uint64_t;

    [tương tự với số nguyên có dấu]
    Xem thêm ở www.boost.org
    Our dreams are young and we both know they take us where we want to go...

Các đề tài tương tự

  1. Cách gì để update file .def cho môi trường 64 bits?
    Gửi bởi nguyenlt2 trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 0
    Bài viết cuối: 01-10-2013, 11:43 AM
  2. VC++ Build ứng dụng windows 32bit trên windows 64 bits như thế nào?
    Gửi bởi thanh92_d10cn4 trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 1
    Bài viết cuối: 15-05-2012, 11:42 AM
  3. Ghost Windows 7 OEM Home Premium 7601 Sp1 64 Bits + Office Stater 2010 + Full Soft+ Full Driver ( BQT 4r Share10s.Co
    Gửi bởi chicken_it_90 trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 29-12-2011, 01:32 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn