文章目錄
- 一.整數在記憶體中的存盤
- 1.原碼,反碼,補碼的概念
- 2.位元組序
- 二.練習
- (1)
- (2)
- (3)
- (4)
- (5)
- (6)
- (7)
一.整數在記憶體中的存盤
1.原碼,反碼,補碼的概念
int a = 20;
int b = -10;
我們知道會為 a 和 b各分配4個位元組的空間,那如何存盤呢?
首先我們先了解一下原碼,反碼,補碼的概念:
計算機中的有符號數有三種表示方法,即原碼、反碼和補碼,
三種表示方法均有符號位和數值位兩部分,符號位都是用0表示“正”,用1表示“負”,而數值位三種表示方法各不相同,
原碼:
直接將二進制按照正負數的形式翻譯成二進制就可以,
反碼:
將原碼的符號位不變,其他位依次按位取反就可以得到了,
補碼:
反碼 + 1得到補碼
正數的原、反、補碼都相同,
對于整形來說:資料存放記憶體中其實存放的是補碼,

我們可以看到記憶體中的確存放的是補碼,但細心的讀者一定可以發現補碼位元組的順序是反的,
2.位元組序
大小端介紹:
大端位元組序存盤 模式,是指資料的低位位元組保存在記憶體的高地址中,而資料的高位,保存在記憶體的低地址中;
小端位元組序存盤 模式,是指資料的低位位元組保存在記憶體的低地址中,而資料的高位,,保存在記憶體的高地址中,

了解了大小端以后,我們來看一道題:
設計一個小程式來判斷當前機器的位元組序
#include<stdio.h>
int check_sys()
{
int a = 1; // 0x 00 00 00 01
return *(char*)&a;
}
int main()
{
if (check_sys() == 1)
printf("小端\n");
else
printf("大端\n");
}
我們可以發現只要我們判斷出第一個位元組的內容是1還是0就可以判斷出機器的位元組序了
因此我們只需要訪問一個位元組即可,
二.練習
(1)
//輸出什么?
#include <stdio.h>
int main()
{
char a= -1;
signed char b=-1;
unsigned char c=-1;
printf("a=%d,b=%d,c=%d",a,b,c);
return 0;
}

(2)
// 輸出什么?
#include <stdio.h>
int main()
{
char a = -128;
printf("%u\n",a);
return 0;
}

(3)
// 輸出什么?
#include <stdio.h>
int main()
{
char a = 128;
printf("%u\n",a);
return 0;
}

(4)
#include<stdio.h>
int main()
{
int i= -20;
unsigned int j = 10;
printf("%d\n", i+j);
//按照補碼的形式進行運算,最后格式化成為有符號整數
return 0;
}

(5)
#include<stdio.h>
int main()
{
unsigned int i;
for (i = 9; i >= 0; i--)
{
printf("%u\n", i);
}
return 0;
}

(6)
#include<stdio.h>
int main()
{
char a[1000];
int i;
for(i=0; i<1000; i++)
{
a[i] = -1-i;
}
printf("%d",strlen(a));
return 0;
}


(7)
#include <stdio.h>
unsigned char i = 0;
int main()
{
for(i = 0;i<=255;i++)
{
printf("hello world\n");
}
return 0;
}
// 死回圈列印hello world


i = 256 時,截斷放在unsigned char 里面是 00000000
因此開始死回圈
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/255575.html
標籤:其他
上一篇:計算機還能火多久呢?
