C/C++メモ(一)2015/8/15
9241 ワード
1.C言語における左値と右値の違い
2.デバッグ、ブレークダウン
3.constとdefineの違い
4.printfのフォールトトレランスメカニズム
5.変数の付与値はコピーバイナリであり、メモリ間で直接コピーすることはできない.CPUを通過しなければならない
6.ポインタの本質
携帯番号使用long long intメモリ数
7.floatストレージ
浮動小数点数の値を10進数で(-1)^s*(1+x)*2^(e-127)と表す
シンボルビットのコード推論
10.0の16進法41200000バイナリ0 100 0001 0 010 0000 0000 0000 0000 0000-10.0の16進法c 1200000バイナリ1 100 0001 0 010 0000 0000 0000 0000結論32番目のbitはシンボルビット
係数のコード推論
べき乗数のコード推論
8.なぜ補数を使うのか
9.ビット演算
と:指定した文字をゼロにするか、指定した文字を異にするか、指定した文字を反転します.
10.1つの数のバイナリの中の1の個数を求めます
11.一つの数の補数と元のコードを求める
ほじょふごう
もとのコードを求めます
逆符号:
符号を補って元の符号の正数の不変の負数を求めるならば逆+1を取って符号のビットをリセットして符号の正数の不変の負数を補って求めるならば-1
, 。
,
, , ( ),a+1,&a, 。
2.デバッグ、ブレークダウン
: ,
GPU,
3.constとdefineの違い
const , define ,
#define K 100.0
const int Knum = 100.0; //
void main()
{
printf("%d
", K);
printf("%d", Knum);
}
4.printfのフォールトトレランスメカニズム
printf , , , printf
`printf("%d, %d
", 10.9, 10);` , , 10
//printf %d,%u,
unsigned int data1 = -1; //
printf("%u
", data1); // ,%d,
printf("%d
", data1); //%u
5.変数の付与値はコピーバイナリであり、メモリ間で直接コピーすることはできない.CPUを通過しなければならない
,const 。
6.ポインタの本質
, ( ),
void main8()
{ // , ( ),
int num = 100;
double *p1 = # // num p1, num
int *p2 = #
float *p3 = #
printf("%f
", *p1); //
printf("%d
", *p2); //
printf("%f
", *p3); // , 0.00000
getchar();
}
携帯番号使用long long intメモリ数
7.floatストレージ
( )
, s, e, x
1. 31 bit , 0 , 1 (32-bit ,64-bit );
2. 30~23bit, 8bit , e , 2 ;
3. 22~0bit, 23bit , , x;
浮動小数点数の値を10進数で(-1)^s*(1+x)*2^(e-127)と表す
シンボルビットのコード推論
float fl1 = 10.0;
float fl2 = -10.0;
printf("%p, %p
", &fl1, &fl2);
10.0の16進法41200000バイナリ0 100 0001 0 010 0000 0000 0000 0000 0000-10.0の16進法c 1200000バイナリ1 100 0001 0 010 0000 0000 0000 0000結論32番目のbitはシンボルビット
係数のコード推論
float fl1 = 10.0;
float fl2 = 11.0;
float fl3 = 5.0;
printf("%p, %p, %p
", &fl1, &fl2, &fl3);
10.0 41200000 0 100 0001 0 010 0000 0000 0000 0000 0000
11.0 41300000 0 100 0001 0 011 0000 0000 0000 0000 0000
10 100 0001 0
1010 +130(130-127) 1.010*2^3
11 100 0001 0
1011 +130(130-127) 1.011*2^3
べき乗数のコード推論
float fl1 = 1.0;
float fl2 = 2.0;
float fl3 = 0.5;
printf("
%p,%p,%p", &fl1, &fl2, &fl3);
1.0 3f800000 0 011 1111 1 000 0000 0000 0000 0000 0000
2.0 40000000 0 100 0000 0 000 0000 0000 0000 0000 0000
0.5 3f000000 0 011 1111 0 000 0000 0000 0000 0000 0000
1.0 011 1111 1
0000 127 1.000*2^0
2.0 100 0001 0
0000 128 1.000*2^1
0.5 100 1111 0
0000 126(e-127) 1.000*2^(-1)
8.なぜ補数を使うのか
1 ,-3
1 : 0000 0001
-3 :1000 0011
, , ,
0000 0010
1000 0010, -2
1 : 0000 0001
-3 : 1111 1101
1111 1110
1111 1110 1000 0010 -2
3 -1
3 : 0000 0011
-1 : 1111 1111
10000 0010
1 , 0000 0010
0000 0010 0000 0010 2
,
9.ビット演算
& 0&0->0 0&1->0 1&0->0 1&1->1
| 0|0->0 0|1->1 1|0->1 1|1->1
^ 0^0->0 0^1->1 1^0->1 1^1->0 0, 1
,
unsigned char ch1 = 15; //0000 1111
unsigned char ch2 = 255;//1111 1111
ch1 = ch1^ch2; //ch1 = 1111 0000 ch2 = 1111 1111
ch2 = ch2^ch1; //ch2 = 0000 1111 ch1 = 1111 0000
ch1 = ch1^ch2; //ch1 = 1111 1111 ch2 = 1111 0000
~ ~0 = 1 ~1 = 0
!0 = 1
unsigned char ch1 = ~0; ~0 1111 1111
unsigned int int1 = ~0; ~0 1111 1111 1111 1111 1111 1111 1111 1111
<< 0001<<1 -->0010 0001<<2 -->0100 // 2
int num = 1;
printf("%d
", num << 1); // 2, num
printf("%d
", num << 2); // 4, num
printf("%d
", num); // 1
printf("%d
", num <<= 2); // 4,num <<= +=
printf("%d
", num); // 4
>> 0100>>1 -->0010 0100>>2 -->0001 // 2
と:指定した文字をゼロにするか、指定した文字を異にするか、指定した文字を反転します.
10.1つの数のバイナリの中の1の個数を求めます
100 1100100 3 1
100-1=99 1100011
100&99=96 1100000 1 +1
96-1=95 1011111
96&95=64 1000000 1 +1
64-1=63 0111111
64&63=0 0000000 1 +1
for (; num; num = num&(num-1))
wei++;
int getwei3(int num)
{
if (num == 0)
return 0;
else
return 1 + getwei3(num&(num - 1));
}
11.一つの数の補数と元のコードを求める
ほじょふごう
1 0000 0000 0000 0000 0000 0000 0000 0001
-1 1111 1111 1111 1111 1111 1111 1111 1111
1000 0000 0000 0000 0000 0000 0000 0000
1 -1 , 1 -1 , ,
int num = 1;
int data = 1 << 31;
for (int i = 1; i <= 32; i++) {
printf("%c", (data&num ? '1' : '0'));
num <<= 1;
if (i % 4 == 0)
printf(" ");
}
void buma(int n, int cnt)
{
int data = 1 << 31;
if(cnt == 0)
return;
if(cnt %4 == 0)
printf(" ");
printf("%c", (data&n ? '1' : '0'));
n <<=1;
--cnt;
buma(n,cnt);
}
もとのコードを求めます
, , :
-> : , +1
-> : , +1
num = -1;
num = ~num +1;// , ,
num = num | (1<<31);// 1
//
:
if (num < 0) {
num = ~num + 1;//
num = num | data;
}
for (int i = 1; i <= 32; i++) {
printf("%c", (data&num ? '1' : '0'));
num <<= 1;
if (i % 4 == 0)
printf(" ");
}
逆符号:
-1 1000 0001
1111 1110
1111 1111
-1
:
if (num < 0) {
num -=1;
}
for (int i = 1; i <= 32; i++) {
printf("%c", (data&num ? '1' : '0'));
num <<= 1;
if (i % 4 == 0)
printf(" ");
}
符号を補って元の符号の正数の不変の負数を求めるならば逆+1を取って符号のビットをリセットして符号の正数の不変の負数を補って求めるならば-1