Bạn cũng có thể chỉ cần khai báo base_num
là một số nguyên 8 bit:
#include <stdint.h>
uint8_t base_num;
uint16_t crap;
crap = 0xFF00;
base_num = crap;
Nếu trình biên dịch của bạn là lời khen tiêu chuẩn, nó sẽ đặt giá trị của byte(0xFF00)
(0x00
) vào base_num
.
Tôi chưa gặp một trình biên dịch mà không bão hòa số học ở đồng bằng C (không phải C++ hoặc C#), nhưng nếu có, nó sẽ đặt giá trị của sat_byte(0xFF00)
mà là lớn hơn 0xFF
, nó sẽ đưa 0xFF
vào base_num
.
Hãy nhớ rằng trình biên dịch của bạn sẽ cảnh báo bạn về sự mất chính xác trong trường hợp này. Trình biên dịch của bạn có thể bị lỗi trong trường hợp này (Visual Studio hiện với Treat Warnings as Errors
Bật). Nếu điều đó xảy ra, bạn chỉ có thể làm:
base_num = (uint8_t)crap;
nhưng điều này có vẻ giống như những gì bạn đang cố tránh.
Điều bạn đang cố làm dường như là xóa toán tử mô đun vì yêu cầu một phép chia và phép chia là phép toán số học cơ bản tốn kém nhất.Tôi thường sẽ không nghĩ về điều này như một nút cổ chai trong bất kỳ cách nào như bất kỳ trình biên dịch "thông minh" (ngay cả trong chế độ gỡ lỗi) sẽ "tối ưu hóa" nó để:
base_num = crap & 0xFF;
trên một nền tảng được hỗ trợ (mỗi bộ vi xử lý chính tôi đã đã nghe về - x86, AMD64, ARM, MIPS). Tôi sẽ chết lặng khi nghe một bộ xử lý không có chỉ dẫn số học AND và OR cơ bản.
Nguồn
2012-11-26 16:53:38
'Cơ số' có phải là hằng số hay không thay đổi? – Xymostech
Nếu trình biên dịch có giá trị bất cứ điều gì, nó thay thế '% 256' bằng' & 0xFF' trên mọi nền tảng nơi nó nhanh hơn '%'. Giá trị của 'base' là gì? –
Bạn có thể khai báo 'base_num' là số nguyên 8 bit (chưa ký) –