Đối với tính di động, bạn có thể sử dụng:
limits.h
#define LNG_BIT (sizeof(long) * CHAR_BIT)
unsigned long num = 1UL << (LNG_BIT - 1);
Để có được "thấp int", một cái gì đó giống như ?:
#define INT_BIT (sizeof(int) * CHAR_BIT)
if (LNG_BIT > INT_BIT)
return num & (~0UL >> INT_BIT);
else
return num;
hoặc
num &= ~(~0U << INT_BIT);
Hoặc, sử dụng mặt nạ, vv Phụ thuộc lớn vào lý do tại sao, cho những gì, vv bạn muốn các bit int.
Cũng lưu ý các tùy chọn do trình biên dịch đưa ra; I E. nếu bạn đang sử dụng gcc:
-m32
-m64
-mx32
Tạo mã cho phiên bản 32-bit hoặc Môi trường 64 bit.
* Tùy chọn -m32 đặt int, dài và kiểu con trỏ thành 32 bit và tạo mã chạy trên bất kỳ hệ thống i386 nào.
* Tùy chọn -m64 đặt int thành 32 bit và kiểu con trỏ dài đến 64 bit và tạo mã cho kiến trúc x86-64. Đối với Darwin chỉ tùy chọn -m64 cũng tắt các tùy chọn -fno-pic và -mdynamic-no-pic.
* Tùy chọn -mx32 đặt int, dài và kiểu con trỏ thành 32 bit và tạo mã cho kiến trúc x86-64.
Ngoài ra còn có -maddress-mode=long
, vv
-maddress-mode = dài
Tạo mã cho chế độ địa chỉ dài. Điều này chỉ được hỗ trợ cho các môi trường 64-bit và x32. Đây là chế độ địa chỉ mặc định cho môi trường 64 bit.
Hãy thử: 'unsigned num dài = 1UL << 63;' – Mysticial
@Mysticial Tại sao không gửi đó như là một câu trả lời cùng với các công cụ xúc tiến số nguyên? – cnicutar
Phụ thuộc vào trình biên dịch được sử dụng. Nhiều trình biên dịch kế thừa sẽ mặc định là 32 bit, ngay cả khi chạy trên máy 64 bit. Xác nhận rằng 'sizeof num' là 8 trước khi thử thêm bất kỳ thứ gì. – wallyk