数据类型长度、原反补码及移位
1 數據類型
java中:
byte ?8位 1字節
short/char 16位? ?2字節
int? ?32位 ? 4字節
long? ? 64位 8字節
float 32位 4字節
double? 64位 8字節
c在x8632位中
printf("%d\n",sizeof(char)); //1字節
printf("%d\n",sizeof(short)); //2
printf("%d\n",sizeof(int)); //4
printf("%d\n",sizeof(long)); //4
printf("%d\n",sizeof(float)); //4
printf("%d\n",sizeof(double)); //8
其指針大小均為4字節,尋址32位。
?
2 原補碼
作用:一是減法變加法,二是正0與負0一致
結果:計算機中數值以補碼形式表示
具體:-128=[1000 0000]補,32位系統中表示值為[-128, 127],0其補碼僅為[0000 0000]
練習:
1)
int main()
{
??? char a=64;
??? a <<=1;
??? printf(“%d ”,a);
??? a>>=1;
??? printf(“%d ”,a);
??? return 0;
}
結果:-128 -64
說明:
有符號數據類型的移位操作:
對于char、short、int、long這些有符號的數據類型:
負數 左移:符號位始終為1,其他位左移??
正數 左移:所有位左移,即 <<,可能會變成負數??
負數 右移:取絕對值,然后右移,再取相反數 (對于x86平臺的gcc編譯器,最高位移入1,也就是仍保持負數的符號位,這種處理方式對負數仍然保持了“右移1位相當于除以2”的性質。)
正數 右移:所有位右移,即 >> ,高位補0
一個程序如果使用了有符號數的右移位操作,它就是不可移植的
因為在C語言標準中,只規定了無符號數的移位操作是采用邏輯移位(即左移、右移都是使用的邏輯左移和邏輯右移)。
而對于有符號數,其左移操作還是邏輯左移,但右移操作是采用邏輯右移還是算術右移就取決于機器了!(算術右移和邏輯右移的區別是:算術右移不右移符號位,即最高位,右移后前補0還是1取決于符號位的值;邏輯右移執行時將移動符號位,右移后前補0)。
2)
#include<iostream.h>
void main()
{
?short int n=-1;
?cout<<(unsigned short int)n<<endl;
}
結果:32位操作系統下為:65535
無符號即將符號位算為數值位考慮。
3)
unsigned char a=0xA5;
unsigned char b=~a<<4;
unsigned char c=~a>>4;
printf("b=%d\n",b); //b=160
printf("c=%d\n",c); //c=245
int i=4;
printf("i=4 left shift%d\n",~i<<2); //i=4 left shift -20
printf("i=4 right shift%d\n",~i>>2); //i=4 right shift -2
int j=-6;
printf("j=-6 left shift%d\n",~j<<2); //j=-6 left shift 20
printf("j=-6 right shift%d\n",~j>>2); //j=-6 right shift 1
3 進制轉換
10進制轉為R進制
整數部分通過連續/R,取在[0, R-1]間的余倒著連起。
小數部分通過連續*R,取結果中的整數順著連起。
將兩部分相加,即可。
轉載于:https://www.cnblogs.com/ele7en/archive/2012/08/11/2633398.html
總結
以上是生活随笔為你收集整理的数据类型长度、原反补码及移位的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: http和HTTPS的区别及SSL介绍
- 下一篇: pku 1691 Painting A