位(bits)和整数(ints)的二进制表示

本文介绍了C语言中各种数据类型的字节占用情况,并详细解释了如何使用二进制位来表示集合及其基本运算,包括交集、并集、差集和补集等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在计算机中,数据都是用二进制来表示的,一个0或1就是一个位(bit),8个位组成一个字节(byte),C语言中的数据类型占用字节数如下表:

C语言类型典型的32位机器典型的64位机器x86-64
char111
short222
int444
long488
float444
double888
pointer488

二进制串还可以用来表示集合,长度为w的位向量可表示{0, 1, …, w-1}的子集,如果j∈A,则aj=1。
比如,01101001可表示子集{0, 3, 5, 6},01010101可表示{0, 2, 4, 6}。集合的交集可以用与(&)操作实现,即01000001,对应集合{0, 6};并集对应或(|)操作,结果为01111101,即{0, 2, 3, 4, 5 ,6};差集对应异或(^)操作,结果为00111100,即{2, 3, 4, 5};最后,补集对应取反(~)操作,结果为10101010,即{1, 3, 5, 7}。

进行右移操作的时候,左边位数的填充有两种方式。一种是逻辑右移,填0;另一种是算术右移,填原来的最高有效位。

### 48二进制补码的概念 在计算机科学中,为了有效地表示有符号整数并简化加法器的设计,采用了二进制补码表示法。这种编码方式允许机器使用相同的硬件电路来进行无符号数带符号数之间的加减操作。 #### 4二进制补码 对于4系统而言,能够表达的数值范围是从-8到7。具体来说: | 十进制 | 二进制补码 | |--------|------------| | -8 | `1000` | | ... | ... | | -1 | `1111` | | 0 | `0000` | | 1 | `0001` | | ... | ... | | 7 | `0111` | 当最高有效(MSB)为1时,则该数被认为是负数;而如果MSB为0,则认为是非负数[^1]。 要获得某个正整数n对应的4二进制补码形式,只需将其转换成普通的4二进制即可。而对于一个负整数-n,在求其补码之前先计算它的绝对值|n|的原码,接着对该原码按取反再加一得到最终的结果。 ```c++ // C++ example to convert decimal to 4-bit two's complement int dec_to_4bit_twos_complement(int n) { int result; if(n >= 0 && n <= 7){ // Positive numbers directly converted into binary. result = n; }else{ // For negative numbers, calculate absolute value, // invert bits and add one. result = (~abs(n)) + 1; } return result % 16; // Ensure it fits within 4 bits by modulo operation with base(2^4). } ``` #### 8二进制补码 同样的原理适用于更宽泛的数据宽度,比如常见的8字节。此时可表示的范围扩大到了−128至127之间。下表展示了部分对应关系: | 十进制 | 二进制补码 | |--| | -128 | `10000000` | | ... | ... | | -1 | `11111111` | | 0 | `00000000` | | 1 | `00000001` | | ... | ... | | 127 | `01111111` | 同样地,通过改变最左边的一来区分正值还是负值,并遵循上述提到的方法完成从十进制向八二进制补码的转变过程。 ```python def dec_to_8bit_twos_complement(n): """Convert a given integer 'n' (-128 ≤ n ≤ 127) to its equivalent 8-bit two’s complement.""" if not(-128 <= n <= 127): raise ValueError("Input out of range.") mask = 0xFF # Equivalent to eight ones in binary form if n < 0: n = ((~n)+1)&mask return format(n,'08b')[-8:] # Ensures output is always an 8-character string padded with leading zeros as necessary. print(dec_to_8bit_twos_complement(-5)) # Output should be "11111011" ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值