Kiểu dữ liệu int và long trong c

em mới học c học qua data type rồi nhưng có đọc lại của 1 web khác thì thấy các web có định nghĩa độ rộng của type int và long khác nhau. Như 2 cái dưới này.
image


em có làm 1 vài phép thử thì thấy int có thể hiển thị đến giá trị 9 chữ số nhưng có chút lú là kiểu long thì e test nó hiển thị được giá trị lớn hơn 10 chữ số. Nghĩa là không có cái bảng nào trong 2 bảng trên đúng :thinking:

C/C++ chỉ có quy định là sizeof(int) <= sizeof(long int) thôi :slight_smile: Kích thước của intlong sẽ tùy vào môi trường.

2 Likes

mk newbie nên ko rõ khoản môi trường lắm cơ mà vừa mk có vớ được lệnh tra giá trị lớn nhất của kiểu dữ liệu với lại sử dụng lệnh sizeof() thì thấy long và long long có cùng 1 khoảng dữ liệu -9223372036854775808 to 9223372036854775807 còn khoản môi trường nào thì mk ko rõ dùng môi trường nào nữa :sweat_smile:

Kể cả kiểu int cũng có kích cỡ khác nhau đối với kiến trúc khác nhau nhé.
Do đó, nếu bạn làm ở lớp low level thì bạn sẽ học được thói quen là “không tin thằng nào hết”, và dùng kiểu int32_t thay vì int

Đây là ví dụ:

4 Likes

Trong C/C++, nhiều loại dữ liệu nguyên thủy không hoàn toàn giống nhau ở các môi trường khác nhau.
Ví dụ :
int có thể 2 byte hoặc 4 byte.
double có thể 4 byte hoặc 8 byte.
Dẫn tới việc triển khai thuật toán, kế thừa mã giữa các môi trường có thể tiềm ẩn bug.
Để khắc phục thì có một thư viện định nghĩa khác (stdint.h).
Trong thư viện này khai báo các kiểu dữ liệu kèm theo kích thước và sẽ tương đồng nhất ở các môi trường khác nhau.
int32_t, uint32_t, int8_t, uint8_t…

4 Likes

type int chạy từ -10^9 đến 10^9 kích thước kiểu int tầm 2 hoặc 4 bytes, còn như type long thì chạy từ -10^19 đến 10^19 kích thước kiểu long tầm 8 bytes và gần như là vùng dữ liệu của nó là lớn nhất nhé bạn, nhớ những con số cụ thể đó để thi trắc nghiệm thôi chớ ko cần nhớ nguyên dạy số dài thòng đó nhé.

Bậy.

Số có dấu 64 bit có range [-2^63, 2^63 - 1] và 2^63 < 10^19.

Số có dấu 32 bit có range [-2^31, 2^31 - 1] và 2^31 > 2*10^9.

Không ai ép bạn phải nhớ giá trị cụ thể của 2^31 hay 2^63, bạn đừng có tuyên truyền bậy bạ.

5 Likes

ko biết bạn khai biến theo ngôn ngữ nào, cái mình nói là trong C++, mình ghi nhầm -10^19 đến 10^19 là kiểu long long chứ ko phải long, còn như kiểu int theo mình là hợp lí rồi.

Hình như bạn đang nhầm lẫn giữa 2 khái niệm bởi vì kiểu int dùng trên máy 32 bytes không có nghĩa là 32 bytes đó được sử dụng để lưu trữ nó, nó cũng có thể là 16bit hoặc 8 bit hoặc như mình chỉ ví dụ 2,4 bit như mình đề cập ở trên, nó phụ thuộc vào cái máy và cả cái trình biên dịch nữa ( cụ thể ở đây mình dùng là Dev C++ ) này mình chỉ tính ở mức độ đúng tương đối lấy thêm 9 chữ số nữa thì nó thành 10^9 nếu dùng 4 bytes thôi bạn.

Topic về ngôn ngữ C thì mình trả lời theo ngôn ngữ C, bạn trả lời theo ngôn ngữ C++ thì comment của bạn là off-topic. Bạn không nhìn tiêu đề và tag của topic à?

Dev-C++ không phải là trình biên dịch.

Thì sao?

2^31 có 10 chữ số. Nếu bạn đã nói “tương đối” thì đừng khẳng định

Hiện tại bạn thậm chí còn đang loạn 2 đơn vị bit và byte với nhau nên bạn cần phải chắc kiến thức trước khi nói người khác.

5 Likes

bạn cãi cùn quá C++ chắc bỏ C vào nó chạy ko đc hả bạn ở đây đang phân tích là cái biến khi chạy sẽ lấy giá trị từ vùng nào tới vùng nào, còn bạn đưa nguyên vùng 2^31 rồi 2^64 là vùng tối đa lưu trưc trên máy, mình ghi nhầm toàn bộ mấy cái đó là byte hết ko có bit nào hết chớ bạn nghĩa sao 1-2 bit sao chạy : )), Dev C++ ko phải trình biên dịch thì nó là gì vậy bạn ???
Đơn giản bạn kia chỉ hỏi độ rộng của mấy cái biến thì mình biết sao mình chia sẻ vậy thôi, này khái niệm đơn giản mà bạn.

Trên trang chính thức của Dev-C++ đã ghi:

Mình cũng chỉ đưa ra khoảng giá trị của số nguyên có dấu 32 bit, bạn bắt bẻ gì vậy?

Dù bạn lưu 1 vào 1 biến int32_t thì biến đó vẫn chiếm 32 bit với giá trị là

0b0000 0000 0000 0000 0000 0000 0000 0001

thôi.

Nãy mình nói là 2^63 chứ không phải 2^64 nhé.

2 Likes

32 bit là 4 bytes thì vùng giá trị nó sẽ chạy từ -10^9 đến 10^9 bạn khai báo biến int thì nó nằm trong khoảng đó còn nó chiếm bao nhiêu bytes thì là chuyện khác.
Giờ cho bạn 1 nồi cơm có thể nấu 4 chén cơm, ý bạn là bạn nấu 1 chén cũng sẽ giống như 1 bạn nào đó nấu 3-4 chén có đúng vậy hông ???

Bạn vẫn chưa chịu sửa vùng giá trị này nhỉ.

2 Likes

Bạn có vẻ nắm không chắc lại đi phản biện luyên thuyên rồi.
C hay C++ thì biến kiểu int khi compile ra và chạy đều sẽ xác định luôn sẽ chiếm bao nhiêu bytes rồi, không có chuyện biến int này chiếm 1 byte còn biến int khác chiếm 4 bytes. Khi bạn nói ra khoảng giá trị là đã xác định luôn kích thước vùng nhớ lưu trữ rồi.
Còn về việc biến int sẽ chiếm bao nhiêu bytes sẽ phụ thuộc vào trình dịch
PS: khái niệm biến có kiểu là gì chỉ là khái niệm ở mức ngôn ngữ, CPU nó không hề hiểu hay quan tâm biến vó kiểu là gì cả mà chỉ có thanh ghi và địa chỉ ô nhớ thôi

6 Likes

https://en.cppreference.com/w/cpp/language/types#Data_models

tùy thuộc vào data models của targeted OS thôi :V


bây giờ thông dụng nhất là OS 64-bit. Với int thì cả Win và Linux đều xài 4 bytes, chỉ có 1 số nhỏ OS xài 8 bytes cho int. long thì Win 64-bit lại chỉ xài có 4 bytes, trong khi Linux xài 8 bytes :V Kiểu con trỏ thì cả 2 đều xài 64-bit pointer.

nếu build chương trình 32-bit chạy trên OS 64-bit thì nó lại tuân theo data models của 32-bit systems như ILP32 :V LP32 win16 xài chắc cổ lắm rồi :V

muốn chắc ăn thì xài int32_t hay int64_t nè: https://en.cppreference.com/w/c/types/integer

3 Likes

Đây là các ví dụ mà trên code C thì chạy mà C++ thì không (compile error): https://www.geeksforgeeks.org/write-a-c-program-that-wont-compile-in-cpp/

Trong các ví dụ đó thì số 3 và số 6 được dùng khá phổ biến trong C.

Bạn có thể thử chương trình sau trên các kiến trúc 32-bit để biết kết quả:

#include <stdio.h>
int main()
{
    int a = 1;
    printf("Size of a = %d",sizeof(a));
}


Nếu có compiler nào cho kết quả là sizeof(a) = 1 thì báo mọi người biết với nhé.

Ví dụ của bạn chính xác rồi đó. Nấu 1 chén hay nấu 4 chén đều tốn 1 cái nồi cả. Cái nồi ở đây là vật chứa (kiểu int), chén cơm là data (giá trị từ 1 tới 4).

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?