2008-09-29 35 views

Trả lời

-4

nếu ký tự 'bit' được ký, thì bạn có phạm vi -1, 0, 1, sau đó trở thành số thứ ba. Tôi không nghĩ rằng chữ viết tắt tiêu chuẩn cho điều đó sẽ phù hợp ở đây, nhưng làm cho các cuộc trò chuyện thú vị :)

+0

Sai. Bạn nhận được -1, -0, +0, +1. Hai bit, bốn trạng thái. – Thorsten79

+0

có thể là một cái gì đó như -2, -1, 0, 1 có ý nghĩa hơn, bạn hầu như không bao giờ cần một -0 – davr

+0

http://en.wikipedia.org/wiki/−0_(number) – Thorsten79

2

Tôi không nghĩ Andrew đang nói về các trường bit một bit. Ví dụ, trường 4 bit: 3 bit thông tin số, một bit cho dấu. Điều này hoàn toàn có thể có ý nghĩa, mặc dù tôi thừa nhận không thể đưa ra một kịch bản như vậy ra khỏi đỉnh đầu của tôi.

Cập nhật: Tôi không nói rằng tôi không thể nghĩ đến việc sử dụng cho các trường bit nhiều bit (đã sử dụng tất cả thời gian trong 2400 giây modem để nén dữ liệu càng nhiều càng tốt để truyền), nhưng tôi không thể nghĩ đến việc sử dụng cho các trường bit đã ký, đặc biệt không phải là một trường hợp kỳ lạ, rõ ràng sẽ là khoảnh khắc "aha" đối với người đọc.

+0

Có szenarios, nơi nó là hữu ích. Trong hình học tính toán, bạn thường phải lưu trữ thông tin như "tiếp theo, trước đó, không có gì, giống nhau". Điều đó meks chính xác hai bit. Nó vui vẻ mà bạn có thể nén cấu trúc của bạn đến một kích thước tốt đẹp như 2^n bạn có thể có được một tốt đẹp để có peformance tăng. –

1

Có, nó có thể. C bit-lĩnh vực cơ bản chỉ là số nguyên phạm vi giới hạn. Các giao diện phần cứng thường xuyên đóng gói các bit lại với nhau như vậy mà một số điều khiển có thể đi từ, -8 đến 7, trong trường hợp này bạn muốn một trường bit đã ký hoặc từ 0 đến 15, trong trường hợp này bạn muốn một bit không dấu cánh đồng.

14

Phần liên quan của tiêu chuẩn (ISO/IEC 9899: 1999) là 6.7.2.1 # 4:

A-trường bit sẽ có một loại đó là một phiên bản đủ điều kiện hoặc không đủ tiêu chuẩn của _Bool, int đã ký, int chưa được ký hoặc một số loại được thực hiện khác được xác định .

+2

Tôi nghĩ câu hỏi đặt ra là hỏi về ANSI C (c89/c90) không phải ISO C (c99). – nebuch

8

Có. Ví dụ từ here:

struct { 
    /* field 4 bits wide */ 
    unsigned field1 :4; 
    /* 
    * unnamed 3 bit field 
    * unnamed fields allow for padding 
    */ 
    unsigned  :3; 
    /* 
    * one-bit field 
    * can only be 0 or -1 in two's complement! 
    */ 
    signed field2 :1; 
    /* align next field on a storage unit */ 
    unsigned  :0; 
    unsigned field3 :6; 
}full_of_fields; 

Chỉ bạn biết nếu nó có ý nghĩa trong các dự án của bạn; thông thường, nó cho các trường có nhiều hơn một bit, nếu trường có thể có ý nghĩa tiêu cực.

+0

+1 để hiển thị sự cố di chuyển có thể có (một so với hai bổ sung) khi sử dụng bitfields –

7

Nó rất quan trọng để đủ điều kiện biến của bạn như đã ký kết hoặc unsigned. Trình biên dịch cần biết cách xử lý các biến của bạn trong quá trình so sánh và truyền. Kiểm tra đầu ra của mã này:

#include <stdio.h> 

typedef struct 
{ 
    signed s : 1; 
    unsigned u : 1; 
} BitStruct; 

int main(void) 
{ 
    BitStruct x; 

    x.s = 1; 
    x.u = 1; 

    printf("s: %d \t u: %d\r\n", x.s, x.u); 
    printf("s>0: %d \t u>0: %d\r\n", x.s > 0, x.u > 0); 

    return 0; 
} 

Output:

s: -1 u: 1 
s>0: 0 u>0: 1 

Các cửa hàng biên dịch các biến sử dụng một chút duy nhất, 1 hoặc 0. Đối với các biến ký, bit quan trọng nhất xác định dấu hiệu (cao được đối xử tiêu cực). Do đó, biến đã ký, trong khi nó được lưu trữ dưới dạng 1 trong nhị phân, nó được hiểu là biến âm.

Mở rộng về chủ đề này, một số unsigned hai bit có một phạm vi từ 0 đến 3, trong khi một ký hai số bit có một loạt các -2 đến 1.

+0

+1 để biết ví dụ rõ ràng về những gì có thể xảy ra. –

0

Bit mặt nạ ký loại khác nhau từ phần cứng nền tảng để nền tảng phần cứng do làm thế nào nó có thể đối phó với một tràn từ một sự thay đổi vv

Bất kỳ một nửa công cụ QA tốt sẽ cảnh báo cố ý sử dụng như vậy.

2

Chắc chắn ANSI-C cung cấp cho các trường bit đã ký và chưa ký. Nó là bắt buộc. Đây cũng là một phần của việc viết lớp phủ gỡ lỗi cho các loại dấu phẩy động IEEE-754 [[1] [5] [10]], [[1] [8] [23]] và [[1] [10] [53] ]. Điều này rất hữu ích trong loại máy hoặc bản dịch mạng của dữ liệu đó, hoặc kiểm tra chuyển đổi gấp đôi (64 bit cho phép toán) thành một nửa độ chính xác (16 bit để nén) trước khi gửi qua liên kết, như kết cấu thẻ video.

// Fields need to be reordered based on machine/compiler endian orientation 

typedef union _DebugFloat { 
    float f; 
    unsigned long u; 
    struct _Fields { 
     signed s : 1; 
     unsigned e : 8; 
     unsigned m : 23; 
     } fields; 
    } DebugFloat; 

Eric

1

Một nơi bitfields ký rất hữu ích là trong thi đua, nơi mà các máy mô phỏng có bit ít hơn từ mặc định của bạn.

Tôi hiện đang xem mô phỏng máy 48 bit và đang cố gắng tìm ra nếu nó hợp lý để sử dụng 48 bit trong số 64 bit "dài" qua bitfield ... mã được tạo sẽ là giống như tôi đã làm tất cả các mặt nạ, ký mở rộng vv một cách rõ ràng nhưng nó sẽ đọc tốt hơn rất nhiều ...

Các vấn đề liên quan