2012-03-07 90 views
36

Tôi đang cố gắng sử dụng số nguyên 64 bit trong C, nhưng tôi nhận được tín hiệu hỗn hợp về việc liệu nó có khả thi hay không.Làm thế nào để xác định số nguyên 64 bit trong c

Khi tôi thực hiện printf:

printf("Size of long int:%d\nSize of long long int:%d\n\n",(int)sizeof(long int), (int)sizeof(long long int)); 

Câu trả lời tôi nhận được là:

Kích thước dài int: 4 Kích thước dài dài int: 8

Điều này làm cho tôi cảm thấy rằng một int dài dài có 8 byte = 64 bit.

Tuy nhiên, khi tôi cố gắng để khai báo các biến sau:

long long int a2 = 0x00004444; 
long long int b2 = 0x000044440; 
long long int c2 = 0x0000444400; 
long long int d2 = 0x00004444000; 
long long int e2 = 0x000044440000; 
long long int f2 = 0x0000444400004; 
long long int g2 = 0x00004444000044; 
long long int h2 = 0x000044440000444; 
long long int i2 = 0x0000444400004444; 

4 biến qua (f2, g2, h2, i2) cho tôi thông báo lỗi:

cảnh báo: hằng số nguyên quá lớn đối với loại 'dài'

Tôi nhận được kết quả tương tự khi tôi thay thế 'long long int' bằng 'int64_t'. Tôi cho rằng 'int64_t' đã được nhận ra, vì nó không tạo ra bất kỳ thông báo lỗi nào của chính nó.

Vì vậy, nó xuất hiện 8 byte dài dài của tôi int thực sự là một dài 6 byte int dài, và tôi không hiểu những gì tôi đang thiếu ở đây. Nếu đó là bất kỳ trợ giúp nào, dưới đây là thông tin về trình biên dịch gcc của tôi:

[email protected]:~$ gcc -v 
Using built-in specs. 
Target: i686-linux-gnu 
Configured with: ../src/configure -v 
--with-pkgversion='Ubuntu/Linaro 4.4.4-14ubuntu5' 
--with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs 
--enable-languages=c,c++,fortran,objc,obj-c++ 
--prefix=/usr 
--program-suffix=-4.4 
--enable-shared 
--enable-multiarch 
--enable-linker-build-id 
--with-system-zlib 
--libexecdir=/usr/lib 
--without-included-gettext 
--enable-threads=posix 
--with-gxx-include-dir=/usr/include/c++/4.4 
--libdir=/usr/lib 
--enable-nls 
--with-sysroot=/ - 
-enable-clocale=gnu 
--enable-libstdcxx-debug 
--enable-objc-gc 
--enable-targets=all 
--disable-werror 
--with-arch-32=i686 
--with-tune=generic 
--enable-checking=release 
--build=i686-linux-gnu 
--host=i686-linux-gnu 
--target=i686-linux-gnu 
Thread model: posix 
gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5) 

Nếu có ai biết (hoặc nếu) số nguyên 64 bit có thể truy cập được với tôi, tôi thực sự đánh giá cao bất kỳ trợ giúp nào. Cảm ơn ....

+0

Bạn quên a ',' trong 'printf' của bạn. –

+2

Như là một thay thế cho hậu tố 'LL', biên dịch với' -std = c99' cũng nên hoạt động. Trong C99, hằng số nguyên thập lục phân có loại 'long long int' hoặc' unsigned long long int' nếu nó quá lớn để vừa với '(unsigned) long int', nhưng khớp với' (unsigned) long long int'. Không có hậu tố cần thiết. –

+0

Một điểm, cần được đề cập ở đây, đó là vấn đề không phải là các biến int dài 'f2' đến' i2', mà là các số nguyên nguyên mà bạn đã chỉ định. Trong C89 một số nguyên mà không có hậu tố được chỉ định là kiểu 'int' nếu giá trị đã cho phù hợp với loại đó, nếu không thì nó có kiểu' long int'. Vấn đề là, '0x0000444400004' không phù hợp với' int' hoặc 'long int' và đây là những gì trình biên dịch phàn nàn. Bài tập không phải là vấn đề ở đây, bạn gán một 'long int' cho một' long long int'. Như Daniel viết, c99 giải quyết vấn đề này bằng cách cho phép các chữ 'dài dài'. – Sascha

Trả lời

56

Sử dụng stdint.h cho kích thước cụ thể của các kiểu dữ liệu số nguyên, và cũng có thể sử dụng hậu tố thích hợp cho các hằng số nguyên theo nghĩa đen, ví dụ .:

#include <stdint.h> 

int64_t i2 = 0x0000444400004444LL; 
+0

Cảm ơn, tôi cho rằng tôi sẽ phải thử nghiệm điều này. Hậu tố 'LL' dường như là đủ. Vì vậy, bây giờ tôi phải tìm ra/nghiên cứu nếu i64_t được sử dụng chủ yếu cho khả năng đọc hoặc thực sự buộc * chính xác * 64 bit tan số nguyên. – user1245262

+1

'int64_t' vừa mạnh vừa di động. 'dài int' không phải là. –

+1

Về lý thuyết, 'int64_t' là tùy chọn. Tuy nhiên, 'int_least64_t' và' long long int' là (tính bằng C99) được bắt buộc bởi chuẩn và phải có ít nhất 64 bit (63 bit bit + bit dấu). –

27

Thử hậu tố LL về số, trình biên dịch có thể truyền nó thành loại trung gian như một phần của phân tích cú pháp. Xem http://gcc.gnu.org/onlinedocs/gcc/Long-Long.html

long long int i2 = 0x0000444400004444LL;

Thêm vào đó, trình biên dịch được loại bỏ các số không hàng đầu, vì vậy 0x000044440000 đang trở thành 0x44440000, mà là một hoàn toàn chấp nhận 32-bit số nguyên (đó là lý do tại sao bạn không nhìn thấy bất kỳ cảnh báo trước f2).

+0

Cảm ơn, điều này đã làm việc :) – user1245262

+0

@MartinBeckett: Tôi có thể làm gì nếu trình biên dịch cho phần cứng nhúng của tôi không hỗ trợ C99? – user2284570

4

Sử dụng int64_t, mã C99 cầm tay.

int64_t var = 0x0000444400004444LL; 

Đối với in ấn:

#define __STDC_FORMAT_MACROS 
#include <inttypes.h> 

printf("blabla %" PRIi64 " blabla\n", var); 
+0

Cảm ơn, hậu tố 'LL' có vẻ là giải pháp làm việc đơn giản nhất. Vì vậy, bây giờ tôi cần phải tìm ra bao nhiêu mục đích của int64_t là cho khả năng đọc và bao nhiêu là thực sự thực thi 64 bit. – user1245262

+0

@ user1245262, sử dụng int64_t khi bạn phải có 64bits - nghĩa là một số trường dữ liệu chính xác là dài. Sử dụng lâu dài khi bạn cần nhiều thời gian hơn - sau đó bạn sẽ vẫn ổn trên máy 256 bit vào năm tới! –

+3

dài dài int là * ít nhất * 64 bit. int64_t là * chính xác * 64 bit. –

1

Nối ll suffix để chữ số hex cho 64-bit (lâu dài int), hoặc hậu tố ull cho unsigned 64-bit (unsigned dài dài)

3

Cách chỉ định số nguyên 64 bit trong c

Đi ngược lại thông thường ý tưởng tốt để thêm LL.

Gắn thêm LL vào số hằng số nguyên sẽ đảm bảo loại tối thiểu là long long. Nếu hằng số nguyên là bát phân hoặc hex, hằng số sẽ trở thành unsigned long long nếu cần.

Nếu những người không quan tâm chỉ định loại quá rộng, thì LL là OK. khác, hãy đọc tiếp.

long long có thể rộng hơn 64 bit.

Hôm nay, hiếm khi long long không phải là 64 bit, nhưng C chỉ định long longít nhất 64 bit. Vì vậy, bằng cách sử dụng LL, trong tương lai, mã có thể được xác định, nói, một số 128-bit.

C có Macros cho số nguyên hằng mà trong trường hợp dưới đây sẽ là loại int_least64_t

#include <stdint.h> 
#include <inttypes.h> 

int main(void) { 
    int64_t big = INT64_C(9223372036854775807); 
    printf("%" PRId64 "\n", big); 
    uint64_t jenny = INT64_C(0x08675309) << 32; // shift was done on at least 64-bit type 
    printf("0x%" PRIX64 "\n", jenny); 
} 

đầu ra

9223372036854775807 
0x867530900000000 
Các vấn đề liên quan