導航:首頁 > 網路安全 > 浮點數如何變為網路位元組序

浮點數如何變為網路位元組序

發布時間:2022-12-09 08:42:34

Ⅰ C語言的浮點型怎麼轉換為整型

C語言中,浮點型轉換為整型可以用:強制類型轉換、自動類型轉換,例如:(int)3.14、int a = 3.14。

1、強制類型轉換

強制類型轉換是通過類型轉換運算來實現的。其一般形式為:(類型說明符)(表達式),其功能是把表達式的運算結果強制轉換成類型說明符所表示的類型。

例如: (double) a 把a轉換為雙精度浮點型,(int)(x+y) 把x+y的結果轉換為整型。

2、自動類型轉換

(1)執行算術運算時,低類型(短位元組)可以轉換為高類型(長位元組);例如: int型轉換成double型,char型轉換成int型等。

(2)賦值表達式中,等號右邊表達式的值的類型自動隱式地轉換為左邊變數的類型,並賦值給它。

(3)函數調用時,將實參的值傳遞給形參,系統首先會自動隱式地把實參的值的類型轉換為形參的類型,然後再賦值給形參。

(4)函數有返回值時,系統首先會自動隱式地將返回表達式的值的類型轉換為函數的返回類型,然後再賦值給調用函數返回。

(1)浮點數如何變為網路位元組序擴展閱讀:

C語言中常用的數據類型:

1、int:整型

2、float:單精度浮點型

3、double:雙精度浮點型

4、char:字元型

5、char *:字元指針型

Ⅱ 浮點類型是如何存儲的

計算機中最小的存儲單位是bit只能保存0和1,整數在內存中如何存儲我們都知道,將要存儲的數字轉成2進制即可

用windows自帶的計數器可以方便的查看整數對應的2進制值
如:
byte類型(單位元組)

那浮點類型是如何用這么少的位元組(如float 4位元組)表示這么大(float 最大 3.4028235E38)的數字呢?

浮點數,是屬於有理數中某特定子集的數的數字表示,在計算機中用以近似表示任意某個實數。具體的說,這個實數由一個整數或定點數(即尾數)乘以某個基數(計算機中通常是2)的整數次冪得到,這種表示方法類似於基數為10的科學計數法。

科學計數法是一種記數的方法。把一個數表示成a與10的n次冪相乘的形式(1≤|a|<10,a不為分數形式,n為整數),這種記數法叫做科學計數法。當我們要標記或運算某個較大或較小且位數較多時,用科學計數法免去浪費很多空間和時間。

這也是一種目前最常用的浮點數標准!為許多CPU與浮點運算器所採用。

簡單的說就是將一個浮點數字拆成3個部分(符號部分、指數部分、小數部分) 存儲在連續的bit中,類似科學計數法。

用 {S,E,M}來表示一個數 V 的,即 V =(-1)S × M × 2E ,如下:

其中:

其中d.dd...d 為有效數字,β為基數,e 為指數

有效數字中 數字的個數 稱為 精度 ,我們可以用 p 來表示,即可稱為 p 位有效數字精度。
每個數字 d 介於 0 和基數 β 之間,包括 0。

對十進制的浮點數,即基數 β 等於 10 的浮點數而言,上面的表達式非常容易理解。
如 12.34,我們可以根據上面的表達式表達為:
1×10 1 + 2×10 0 + 3×10 -1 + 4×10 -2
其規范的浮點數表達為: 1.234×10 1

但對二進制來說,上面的表達式同樣可以簡單地表達。
唯一不同之處在於:二進制的 β 等於 2,而每個數字 d 只能在 0 和 1 之間取值。

如二進制數 1001.101 ,我們可以根據上面的表達式表達為:
1×2 3 + 0×2 2 + 0×2 1 + 1×2 0 + 1×2 -1 + 0×2 -2 + 1×2 -3
其規范浮點數表達為: 1.001101×2 3

二進制數 1001.101 轉成十進制如下:

由上面的等式,我們可以得出:
向左移動二進制小數點一位相當於這個數除以 2,而向右移動二進制小數點一位相當於這個數乘以 2。
如 101.11 = 5又3/4 (5.75),向左移動一位,得到 10.111 = 2又7/8 (2.875)。

除此之外,我們還可以得到這樣一個基本規律:
一個十進制小數要能用浮點數精確地表示,最後一位必須是 5(當然這是必要條件,並非充分條件)。
如下面的示例所示:

基本換算方法:
將10進制的數拆分成整數和小數兩個部分
整數部分除以2,取余數;小數部分乘以2,取整數位。

示例:
將十進制 1.1 轉成 二進制

整數部分:1
1

小數部分:0.1

二進制形式表示為:
1.000110011001100110011...

再加上整數1,約等於:
1.099609375

計算的位數越多越精確

注意:
二進制小數不像整數一樣,只要位數足夠,它就可以表示所有整數。
在有限長度的編碼中,二進制小數一般無法精確的表示任意小數,比如十進制小數0.2,我們並不能將其准確的表示為一個二進制數,只能增加二進制長度提高表示的精度。

根據 IEEE 754 浮點「雙精度格式」位布局。

如果參數是正無窮大,則結果為 0x7ff0000000000000L。
如果參數是負無窮大,則結果為 0xfff0000000000000L。
如果參數是 NaN,則結果為 0x7ff8000000000000L。

根據 IEEE 754 浮點「單一格式」位布局。

如果參數為正無窮大,則結果為 0x7f800000。
如果參數為負無窮大,則結果為 0xff800000。
如果參數為 NaN,則結果為 0x7fc00000。

這里以 double類型說明

將一個浮點數與上面的掩碼進行與運算,即可得到對應的 符號位、指數位、尾數位 的值。

1.000110011001100110011...

所以存為:
0 01111111111 000110011001100110011...

根據 IEEE 754 規范

在二進制,第一個有效數字必定是「1」,因此這個「1」並不會存儲。
單精和雙精浮點數的有效數字分別是有存儲的23和52個位,加上最左邊沒有存儲的第1個位,即是24和53個位。

通過計算其能表示的最大值,換十進制來看其精度:

浮點運算很少是精確的,只要是超過精度能表示的范圍就會產生誤差。而往往產生誤差不是因為數的大小,而是因為數的精度。

我自己理解為分兩種情況(這個不一定是對)

通過上面的轉換示例,我們知道小數的二進製表示一般都不是精確的,在有限的精度下只能盡量的表示近似值

值本身就不是精確的,再進行計算就很可能產生誤差

輸出:

0.1
原始值: 0 01111111011
指數:1019 -1023 = -4
二進制形式:
0.0001

0.2
原始值:0 01111111100
指數:1020 -1023 = -3
二進制形式:
0.00

0.3
原始值:0 01111111101
指數:1021 = -2
二進制形式:
0.00

二進制加法運算

這里用float驗證,float最大的精度是8位數

對於不能精確的表示的數,採取一種系統的方法:找到「最接近」的匹配值,它可以用期望的浮點形式表現出來,這就是舍入。

對於舍入,可以有很多種規則,可以向上舍入,向下舍入,向偶數舍入。如果我們只採用前兩種中的一種,就會造成平均數過大或者過小,實際上這時候就是引入了統計偏差。如果是採用偶數舍入,則有一半的機會是向上舍入,一半的機會是向下舍入,這樣子可以避免統計偏差。而 IEEE 754 就是採用向最近偶數舍入(round to nearest even)的規則。

(這段是網上抄的)

這里以java語言示例,用大端的方式示例(網路序)

java中是以大端模式存儲的,java對我們屏蔽了內部位元組順序的問題以實現跨平台!

實際在不同的cpu架構下,存儲方式不同,我們常用的X86是以小端的模式存儲的。

網路傳輸一般採用大端序,也被稱之為網路位元組序,或網路序。IP協議中定義大端序為網路位元組序。

輸出:

Ⅲ 怎麼把浮點值轉換為4位元組的16進制數

我關於這個寫了一篇論文.
在公司現有的產品通訊協議升級的過程中,涉及到了浮點數的傳輸。利用傳統的做法就是將浮點數乘以一個整數倍數,將其放大到一定的精度再取整,將取整後的整數傳輸出去,到了目的地,再將整數除以相應的倍數,還原回真實值,這種方法雖然可以避免傳輸過程中浮數的操作,可是卻給通訊雙方帶來了計算上的壓力,將一個浮點數放大若干倍及縮小若干倍是需要進行乘除法運算的。而且標準的Modbus RTU協議也是允許傳遞浮點數操作的,因此,在通訊中使用浮點數是,最主要的是要注意浮點數在內存中的存儲格式,這是通訊雙方正確解析通訊數據的前提。IEEE委員會對浮點數的結構做了明確的規定,而且現在大多數的硬體廠商及編譯器都採用了IEEE對浮點數的規定,IEEE規定了二進制浮點數可採用32位、64位及128位表示。對於我們公司所使用的研發的產品及對未來產品發展的預測,使用32位浮點數足以滿足數據的大小及精度的要求,因此我們通訊協議中的浮點數採用32位二進製表示,根據IEEE的規定,32位浮點數表示為
(-1)s X be X m
其中
S為0或1
b為所使用的進制
e為一個整數且eMin<=e<=eMax
m被表示為下面一組數字形式的數值,d0.d1d2d3d4……dp-1(di是一個整數且0<=di<=b),因此 0<=m<b。
對於用32位二進製表示的浮點數,b的取值為2,eMin = 0,eMax = 127。例如-11的二進製表示為-1011,轉換為上面的IEEE表示形式為
(-1)1 X (10)3 X (1.011),將IEEE表示形式編碼為32位二進制數的表示形式為

其中e使用移碼表示,
IEEE對浮點數規定相關內容參見《The IEEE Standard for Floating-Point Arithmetic》。

Ⅳ C中socket傳輸時int,long.float類型要怎麼處理需要轉成網路位元組順序么怎麼轉

  1. 要。只要類型長度超過1位元組的,都要轉換網路位元組序。

  2. socket api,這些很容易搜索到的,htonl,htos,用法還是自己找吧,自己找的,才會印象深刻

Ⅳ 計算機組成原理——浮點數表示方法

就是在二進制中,一個數的小數點可以可以通過乘以2的冪次來改變位置,這是其原理 。

浮點數的組成:階符+ 階碼 +數符+ 尾數

計算機中表示浮點數的字長通常為32位,其中7位作階碼,1位為階符,23位尾數,1位作數符

例如用2個位元組表示一個浮點數(32寫起來麻煩,所以用2個位元組就是16位來舉例,呵呵希望諒解) (72.45x10^5)D先換成普通二進制數(11011101000110011001000)B

然後開始像十進制數的科學計數法那樣寫成約等於(0.1101110)Bx(2^23)D

之後再將後半部分的(2^23)D轉換成(2^10111)B

於是整個數就變成了(0.1101110x2^10111)B

在計算機中表示成0001011101101110 其中第一個0是階符表示指數是正的第九個0表示尾數是正的他們中間的就是階碼,後面的就是尾數。

Ⅵ 如何用C語言實現向某個IP發送數據包(例如4個浮點數)

使用socket編程即可。
1、網路的Socket數據傳輸是一種特殊的I/O,Socket也是一種文件描述符。Socket也具有一個類似於打開文件的函數調用Socket(),該函數返回一個整型的Socket描述符,隨後的連接建立、數據傳輸等操作都是通過該Socket實現的。

2、下面用Socket實現一個windows下的c語言socket通信例子,這里客戶端傳遞一個字元串,伺服器端進行接收。

【伺服器端】
#include "stdafx.h"
#include <stdio.h>
#include <winsock2.h>
#include <winsock2.h>
#define SERVER_PORT 5208 //偵聽埠
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int ret, nLeft, length;
SOCKET sListen, sServer; //偵聽套接字,連接套接字
struct sockaddr_in saServer, saClient; //地址信息
char *ptr;//用於遍歷信息的指針
//WinSock初始化
wVersionRequested=MAKEWORD(2, 2); //希望使用的WinSock DLL 的版本
ret=WSAStartup(wVersionRequested, &wsaData);
if(ret!=0)
{
printf("WSAStartup() failed!\n");
return;
}
//創建Socket,使用TCP協議
sListen=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sListen == INVALID_SOCKET)
{
WSACleanup();
printf("socket() faild!\n");
return;
}
//構建本地地址信息
saServer.sin_family = AF_INET; //地址家族
saServer.sin_port = htons(SERVER_PORT); //注意轉化為網路位元組序
saServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //使用INADDR_ANY 指示任意地址

//綁定
ret = bind(sListen, (struct sockaddr *)&saServer, sizeof(saServer));
if (ret == SOCKET_ERROR)
{
printf("bind() faild! code:%d\n", WSAGetLastError());
closesocket(sListen); //關閉套接字
WSACleanup();
return;
}

//偵聽連接請求
ret = listen(sListen, 5);
if (ret == SOCKET_ERROR)
{
printf("listen() faild! code:%d\n", WSAGetLastError());
closesocket(sListen); //關閉套接字
return;
}

printf("Waiting for client connecting!\n");
printf("Tips: Ctrl+c to quit!\n");
//阻塞等待接受客戶端連接
while(1)//循環監聽客戶端,永遠不停止,所以,在本項目中,我們沒有心跳包。
{
length = sizeof(saClient);
sServer = accept(sListen, (struct sockaddr *)&saClient, &length);
if (sServer == INVALID_SOCKET)
{
printf("accept() faild! code:%d\n", WSAGetLastError());
closesocket(sListen); //關閉套接字
WSACleanup();
return;
}
char receiveMessage[5000];
nLeft = sizeof(receiveMessage);
ptr = (char *)&receiveMessage;
while(nLeft>0)
{
//接收數據
ret = recv(sServer, ptr, 5000, 0);
if (ret == SOCKET_ERROR)
{
printf("recv() failed!\n");
return;
}
if (ret == 0) //客戶端已經關閉連接
{
printf("Client has closed the connection\n");
break;
}
nLeft -= ret;
ptr += ret;
}
printf("receive message:%s\n", receiveMessage);//列印我們接收到的消息。

}
// closesocket(sListen);
// closesocket(sServer);
// WSACleanup();
}
【客戶端】
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#define SERVER_PORT 5208 //偵聽埠
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int ret;
SOCKET sClient; //連接套接字
struct sockaddr_in saServer; //地址信息
char *ptr;
BOOL fSuccess = TRUE;
//WinSock初始化
wVersionRequested = MAKEWORD(2, 2); //希望使用的WinSock DLL的版本
ret = WSAStartup(wVersionRequested, &wsaData);
if(ret!=0)
{
printf("WSAStartup() failed!\n");
return;
}
//確認WinSock DLL支持版本2.2
if(LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!=2)
{
WSACleanup();
printf("Invalid WinSock version!\n");
return;
}
//創建Socket,使用TCP協議
sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sClient == INVALID_SOCKET)
{
WSACleanup();
printf("socket() failed!\n");
return;
}
//構建伺服器地址信息
saServer.sin_family = AF_INET; //地址家族
saServer.sin_port = htons(SERVER_PORT); //注意轉化為網路節序
saServer.sin_addr.S_un.S_addr = inet_addr("192.168.1.127");
//連接伺服器
ret = connect(sClient, (struct sockaddr *)&saServer, sizeof(saServer));
if (ret == SOCKET_ERROR)
{
printf("connect() failed!\n");
closesocket(sClient); //關閉套接字
WSACleanup();
return;
}

char sendMessage[]="hello this is client message!";
ret = send (sClient, (char *)&sendMessage, sizeof(sendMessage), 0);
if (ret == SOCKET_ERROR)
{
printf("send() failed!\n");
}
else
printf("client info has been sent!");
closesocket(sClient); //關閉套接字
WSACleanup();
}

Ⅶ 浮點型數據的相互轉換

標准4位元組浮點型在計算機里存儲方式如下圖

IEEE754標准中浮點數表示格式IEEE規定的浮點數表示法是一種科學計數法,用符號(正或負)、指數和尾數來表示,底數被確定為2。也就是說浮點數被表示為尾數乘以2的指數次方再帶上符號。具體格式如下: 符號域 指數域 小數域 指數偏移量 單精度浮點數 1 位[31] 8位[30-23] 23位[22-00] 127 雙精度浮點數 1 位[63] 11 位[62-52] 52 位[51-00] 1023 下面以單精度浮點數為例來介紹浮點數的三個區域:
符號域:符號域佔1位,0表示正數,1表示負數。指數域:指數域共有8位,可表達的范圍為:0~255。為能處理負指數,實際指數位存儲在指數域中值減去一個偏移量(單精度為127,雙精度為1023)。單精度浮點數的偏移量為127,故實際可表達的指數值的范圍為-127~128。尾數域:尾數域共有23位。由於規范浮點數的小數點左側必須為1,所以在保存尾數時,可以省略小數點前面這個1,從而騰出一個二進制位來保存更多的尾數。舉例:比如對於單精度數而言,二進制的1001.101(對應於十進制的9.625)可以表達為1.001101 ×2^3,所以實際保存在尾數域中的
值為0011 0100 0000 0000 0000 000,即去掉小數點左側的1,並用0 在右側補齊。
(
整數部分(9)的計算:1001
小數部分(0.625)的計算:
0.625*2=1.25--------1
0.25 *2=0.5 ----------0
0.5 *2=1.0 -----------1
所以用二進制科學表示方式為:1.001101*2^3
)
實數與浮點數之間的變換舉例例一:已知一個單精度浮點數用16進制數表示為:0xC0B40000,求此浮點數所表達的實數。
先轉換為二進制形式(注意:對於負數二進制補碼轉換成十進制一定要:先取反,後加1)
C 0 B 4 0 0 0 0
1100 0000 1011 0100 0000 0000 0000 0000
按照浮點數格式切割成相應的域 1 1000 0001 01101 000000000000000000
經分析:符號域1 意味著負數;指數域為129 意味著實際的指數為2 (減去偏差值127);尾數域為01101 意味著實際的二進制尾數為1.01101 (加上隱含的小數點前面的1)。所以,實際的實數為:
= -1.01101 × 2^ 2=- ( 1*2^0 + 1*2^(-2) + 1*2^(-3) + 1*2^(-5) ) × 2^2
= -(1+0.25+0.125+0.03125)*4
= -1.40625*4
= -5.625
例二:將實數-9.625變換為相應的浮點數格式。
1) 求出該實數對應的二進制:1001.101,用科學技術法表達為:-1.001101 ×2^3;
2) 因為負數,符號為1;
3) 指數為3,故指數域的值為3 + 127 = 130,即二進制的10000010;
4) 尾數為1.001101,省略小數點左邊的1後為001101,右側0補齊,補夠23位,
最終尾數域為:00110100000000000000000;
5) 最終結果:1 10000010 00110100000000000000000,用16進製表示:0xC11A0000。

Ⅷ 32位浮點型高位元組在前如何變成低位元組在前 怎麼換算, 舉個例子說明

#include<cstdio>
unsigned int swapEndian(unsigned int a){
unsigned char t,*p=(unsigned char *)&a;
t=p[0];
p[0]=p[3];
p[3]=t;
t=p[1];
p[1]=p[2];
p[2]=t;
return a;
}

int main()
{
unsigned int a=0x12345678;
printf("%x => %x",a,swapEndian(a));
return 0;
}
=======
12345678 => 78563412

x86下用匯編最快,
32位,64位寄存器有效
uint32_t changeEndian(uint32_t i){
asm ("bswapl %0;"
: "=r" (i)
: "r" (i)
);
return i;
}

===========
漏看題意,浮點型,數據轉換總其實也沒有必要強調類型。代碼基本一樣
32位單精度浮點轉換代碼
#include<cstdio>
float swapFloatEndian(float a){
unsigned char t,*p=(unsigned char *)&a;
t=p[0];
p[0]=p[3];
p[3]=t;
t=p[1];
p[1]=p[2];
p[2]=t;
return a;
}

int main()
{
unsigned int a=0x12345678;
unsigned int *pi;
float *pf=(float *)&a;
float b=swapFloatEndian(*pf);
pi=(unsigned int *)&b;
printf("%x => %x",a,*pi);
return 0;
}

Ⅸ 請問熟悉浮點計算的朋友們,如何把一個數字變成4位元組浮點數

參見IEEE 754編碼標准
http://en.wikipedia.org/wiki/Single_precision_floating-point_format

0.84這個來說
0.84×2 = 1.68 那麼二進制小數部分第一位為1
0.68×2 = 1.36 那麼二進制小數部分第二位為1
0.36×2 = 0.72 那麼二進制小數部分第三位為0
.。。。。
一直繼續下去直到得到23位 二進制小數(0.1 10101110000101000111101)
正數的符號位為0,
小數點右移一位,得到1 .10101110000101000111101 那麼 exponent位-1 (-1+127=126 biased form)126二進制為01111110
所以0-01111110-10101110000101000111101=3F570A3DH

再看100.0整數部分100=64H=01100100
小數部分為0,
小數點左移6位1.100100, exponent 6+127=133=85H=10000101
0-10000101-10010000000000000000000=42C80000H

Ⅹ 網路傳輸時,float類型要不要轉位元組序

小端法(Little-Endian)就是低位位元組排放在內存的低地址端(即該值的起始地址),高位位元組排放在內存的高地址端;
大端法(Big-Endian)就是高位位元組排放在內存的低地址端(即該值的起始地址),低位位元組排放在內存的高地址端;
網路位元組序是大端位元組序,平常的PC機器上是小端位元組序
需要轉換下,可以用htons()函數做轉換 將主機位元組序轉換為網路上用的位元組序
int 和 long 都可以用htons()函數做轉換
float型的一般來說,編譯器是按照IEEE標准解釋的,即把float/double看作4/8個字元的數組進行解釋。因此,只要編譯器是支持IEEE浮點標準的,就不需要考慮位元組順序。
如果你實在不放心,可以採取下面兩種辦法:
(1)在保證不超過int范圍的情況下,將浮點數乘以100(或1000,10000,視所需精度隨你定)轉換為整數傳輸,在接收端再除以100,得到浮點數。
(2)將浮點數轉換為字元串傳輸,由於字元串是一個位元組一個位元組的流,就不會有位元組順序的問題了。

閱讀全文

與浮點數如何變為網路位元組序相關的資料

熱點內容
公共網路延時特別高怎麼辦 瀏覽:541
日本蘋果4網路設置 瀏覽:724
天童美語網路上課軟體 瀏覽:254
網路合夥人如何找 瀏覽:169
帶無線路由器網路信號弱 瀏覽:384
如何用電話知道對方網路密碼 瀏覽:118
九江公安局網路安全支隊 瀏覽:994
無線網路連接密碼錯誤 瀏覽:428
隨身wifi沒有網路怎麼用 瀏覽:36
如何切換至廣電網路信號 瀏覽:314
網路收款助手在哪裡 瀏覽:300
移動網路設置接哪個位置 瀏覽:20
網路安全宣傳語錄簡短 瀏覽:310
網路上虛擬視頻用哪一個軟體 瀏覽:464
蘋果xsmax網路天線在哪裡 瀏覽:692
移動網路無法使用電信dns解析 瀏覽:663
4g網路如何解析信號 瀏覽:137
移動的網路台式電腦掉線 瀏覽:952
注冊微信網路打不開什麼原因 瀏覽:544
王者榮耀手機網路模式怎麼設置 瀏覽:362

友情鏈接