c語言位元組序
『壹』 c語言結構體的問題
由於關鍵字是union而不是struct,因此這是個聯合的問題
這里假設int變數佔用兩個位元組
聯合mk的意思是,定義兩個位元組的存儲空間,聯合mk包含的兩個變數從不同角度來理解這兩個位元組的含義:變數m將這兩個位元組看作2個字元元素組成的數組,m[0]是第1個元素,m[1]是第2個元素,或者說m[0]訪問第1個位元組,m[1]訪問第2個位元組;變數k將這兩個位元組合起來看做一個整數
因此:mk.m[0]=0;是將聯合定義的第1個位元組賦值為0;mk.m[1]=1;是將第2個位元組賦值成1
兩個位元組按順序的十六進製表示為:00H,01H
整型變數存放是這樣的:低位位元組先存放,然後是高位位元組,假設整型是0x1234,那麼存放的順序是: 34H,12H
從變數k看來,整數是: 0100H,變成十進制(因為printf輸出的是十進制結果)為16
程序輸出:16
『貳』 想請問一下關於C語言的一道程序運行題目,為什麼運行結果是12345678和78
首先你要知道編譯器給union的分配的內存空間是按占最大空間的變數決定,其他成員都是共享這段內存。
你的union中long b最大,int a和uchar c是共享這塊內存;
所以給b賦值,自然a和c也分別有值了。
int佔4個位元組,所以是0x12345678,而c佔一個位元組,則是0x78
TIP:0x12 34 56 78是四個位元組
而且根據你這個C輸出結果來看你的系統應該是小端模式(比如X86),若是在ARM等處理器的環境下你的C輸出估計是0x12,這個你以後學習socket編程的時候,肯定要了解的一個知識點(詳細可以搜索一下大端模式與小端模式)
『叄』 unix C語言網路位元組序 怎麼定義啊 舉個例子 是用char還是什麼
網路位元組序都是大端,你可以使用如下函數處理
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
『肆』 c語言問題
因為windows操作系統是小端序,低位元組放低位,高位元組放高位
所以 21存放在低位c[0] 43存放在高位c[1]
如果在大端序操作系統中,則正好相反
以下程序可以判斷系統的大小位元組序:
判斷大位元組序和小位元組序
#include <stdio.h>
void main() {
int i = 0x12345678;
if(*(char *)&i == 0x12)
printf("Big endian\n");
else if(*(char *)&i == 0x78)
printf("Little endian\n");
}
把高有效位放在低地址段為大位元組序,把低有效位放在低地址段為小位元組序。
『伍』 c語言問題 嘻嘻
Win32中結果是:9
union 定義中 int i[2]; 該成員佔8個位元組,為所有成員中最大成員,故 union 共佔8個位元組。
以下兩條賦值語句:
s->i[0]=0x39;
s->i[1]=0x38;
結果為:
i[0]為前4位元組,其值為0x39,在內存中位元組為:0x39, 0x00, 0x00, 0x00
i[1]為後4位元組,其值為0x38,在內存中位元組為:0x38, 0x00, 0x00, 0x00
(說明:Win32默認編譯設置中位元組序為低位元組在前,故內存中的值如上所示)
對應到成員 char c[4]; 則其值為:0x39, 0x00, 0x00, 0x00
printf("%c\n",s->c[0]); 語句是將成員 char c[4]; 第一元素(即第一位元組)中的值以字元格式輸出,其值為 0x39(對應字元為ASCII的字元「9」),故輸出的結果為:9
『陸』 C語言中int是什麼意思
int表示整型變數,是一種數據類型,用於定義一個整型變數,在不同編譯環境有不同的大小,不同編譯運行環境大小不同。
整型變數包括下面幾種類型:
1、有符號基本整型,關鍵字:[signed] int,數值范圍:-2 147 483 648 ~ 2 147 483 647,位元組:4
2、無符號基本整型,關鍵字:unsigned ,數值范圍:0 ~ 4 294 967 295,位元組:4
3、有符號短整型,關鍵字:[signed] short ,數值范圍:-32768 ~ 32767,位元組:2
4、無符號短整型,關鍵字:unsigned long ,數值范圍:0 ~ 65535,位元組:2
5、有符號長整型,關鍵字:[signed] long ,數值范圍:-2 147 483 648 ~ 2 147 483 647,位元組:4
6、無符號長整型,關鍵字:unsigned long ,數值范圍:0 ~ 4 294 967 295,位元組:4
整型變數的分類
1、基本型
類型說明符為int,在內存中佔4個位元組(不同系統可能有差異,此處原為2,經查證windows系統下為4,VAX系統也如此) ,其取值為基本整常數。
2、短整型
類型說明符為short int或short'C110F1。所佔位元組和取值范圍會因不同的編譯系統而有差異。對於16字機,short int 佔2個位元組,在大多數的32位機中,short int 佔4個位元組。但總的來說,short int 至少16位,也就是2個位元組。
3、長整型
類型說明符為long int或long ,在內存中佔4個位元組,其取值為長整常數。在任何的編譯系統中,長整型都是佔4個位元組。在一般情況下,其所佔的位元組數和取值范圍與基本型相同。
4、無符號型
類型說明符為unsigned。在編譯系統中,系統會區分有符號數和無符號數,區分的根據是如何解釋位元組中的最高位,如果最高位被解釋為數據位,則整型數據則表示為無符號數。
『柒』 c語言 為什麼pc=0後第一個位元組裡面是00不是0 輸出不應該是F000嗎
這個事情涉及到位元組序的問題。intel處理器使用 little endian位元組序
低地址存低位元組,高地址存高位元組。
a在類型轉換的過程中,數值不變,始終是指向初始地址,也就是低地址
所以 *pc =0 改變的是低位元組的數值。
『捌』 C語言雙位元組的數怎麼由主機位元組序轉化網路位元組序
unsigned short a = 0x1122;
unsigned short b = (a>>8) || (a<<8);
其中b就是網路位元組序(大端)
『玖』 C語言 int 和long int 問題
不同平台, int 和long int 長度可能不一樣,
這時候在X86平台下,你的scanf("%d",&b)輸入long int就會出錯,
這又和位元組序有關,x86系列CPU採用little endian方式存儲數據,簡單的說就是數據的高位元組在低地址,低位元組在高地址.
將&b開始的存儲空間從低位元組->高位元組依次記為b0 b1 b2 b3 b4 b5 b6 b7
當b 為int 則scanf("%d",&b)將數據存儲在b0 b1 b2 b3地址中,
低位元組存放在b3,如你輸入的23就存在b3中,而b0=b1=b2=0.
當b為long int時,如果是64位CPU,則long int長度為8位元組,這時實際數據的低位元組應該存放在b7中,最高位元組存放在b0中.可是你的scanf語句的參數確將b當成整數類型,輸入的數據低位元組不是存放在b7隻是存儲在b3,結果本來應該是b7=23 b0=b1=...b6 = 0,可是你的錯誤導致了b3=23,b0=b1=b2=0, b4,b5,b6,b7隨機數.
所以當b為long int時,改成scanf("%ld",&b)就對了.