2.2 整数的表示

2.2.1整数的类型

C语言支持多种数据类型。对于大部分数据类型,32位与64位的程序都是一样的,唯一有区别的是long。在32位程序中long长度是4字节,64位则是8字节。

上表是32位C程序的整数范围,下表是64位C程序的整数类型

2.2.2 -2.2.4带符号数以及无符号数以及转换

对于无符号数,在计算机中则直接使用二进制来进行表示。对于带符号数,在一个16位的带符号整型中,\(T_{Min}=0x8000=-2^{15}\),而\(T_{Max}=0x7FFF=2^{15}-1\),因为其中有一位是符号位
在计算机中,使用补码(Two’s complement)来表示一个负整数。正数的补码等于它本身,而负数的补码等于它对应正数的所有位取反然后再+1.如要求\({-17}_{补}\),则先得到17的二进制数是00010001(8位表示),取反得到11101110,然后再+1得到11101111.
无符号数和带符号数的转换:直接转换(二进制中的数字不变)
即对于\(\omega\)位的带符号数转换为无符号数,转换为
$$
\begin{equation}
T2U_\omega(x)=
\begin{cases}
x+2^\omega, & x\lt0 \\
x, & x\ge 0 \\
\end{cases}
\end{equation}$$
而类似的对于无符号数转换为带符号数,公式为
$$
\begin{equation}
U2T_\omega(u)=
\begin{cases}
u, & x\le TMax_\omega \\
u-2^\omega, & x\gt TMax_\omega \\
\end{cases}
\end{equation}$$
在C语言中,对于无符号数于带符号数的比较,则需要先转换再进行比较,当同时出现无符号数以及带符号数的时候,使用无符号数进行比较。

对于无符号数的截取:直接取后面的\(\omega\)位,在十进制中相当于对于\(2^\omega\)进行取模
对于有符号数的截取:实际上也是在二进制中直接取后面的\(\omega\)位,而对应的在十进制中则是先转换成无符号数,进行取模,然后再转回带符号数。

2.3 二进制整数的运算

2.3.1 无符号数的加法

直接相加,如果在计算机中出现结果小于两个数中的任意一个,则说明溢出

$$
\begin{equation}
x+^u_w y=
\begin{cases}
x+y & x+y<w^\omega \quad Normal \\
x+y-2^\omega & 2^\omega < x+y < 2^{\omega+1} \quad Overflow \\
\end{cases}
\end{equation}$$

这里\(+^u_\omega\)表示无符号加法以及对于\(\omega\)位数的运算。

而对于无符号数的减法\(-^u_w x\)

$$
\begin{equation}
-^u_\omega x =
\begin{cases}
x, &x=0 \\
2^\omega-x, &x>0
\end{cases}
\end{equation}
$$

然后对于无符号数的减法,实际上其是无符号加法逆运算,有\(-^u_\omega+^u_\omega=0\)

2.3.2 带符号数的加法

对于整数\(-2^{\omega-1}\le x,t \le 2^{\omega-1}-1 \),

当两个负数相加结果为整或者两个正数相加结果为负的时候,则说明出现溢出的情况。

此外,有:

2.3.3 带符号数的减法

实际上与无符号数的减法相似,带符号数的减法同样是把减法变成加法来进行运算。具体的变化过程如下:

实际上当出现负溢出的时候,一个数加上\(TMin_\omega=0\),而对于其他的数,则可以使用\(-x\)来把减法转换为加法

2.3.4-5 乘法

$$x *^u_\omega y = (x\cdot y)\ mod\ 2^\omega$$

相当于乘法运算之后进行取模

$$x *^t_\omega y = U2T((x\cdot y)\ mod\ 2^\omega)$$

相当于乘法,取模之后再转换为带符号数

对于一个无符号或者带符号数数乘以2的幂,其运算方法实际上就是左移。\(x << k\)实际上就是\(x\times^t_\omega 2^k(0\le k\lt \omega)\),同样也等于\(x\times^u_\omega 2^k(0\le k\lt \omega)\)

而对于无符号数的除法,\(x/2^k\)等价于\(x >> k\)。而对于带符号数的除法,对于算数右移,当需要向上取整的时候,为\((x+(a<<k)-1) >> k\),而对于需要向下取整的时候,和无符号数一致。这里由于需要向上取整,因此先需要添加一个bias使得结果能够向上偏移。例如\(-30/4=-27/4=-7\),而\(-32/4=-29/4=-8\)。(这里应该是为了考虑计算机中正负数的向上或者向下取整需要统一)。在计算机中,计算除法的方式如下:

$$(x<0 ? x+(1<< k)-1 : x) >> k$$

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇