ホームページ バックエンド開発 C#.Net チュートリアル C/C++ のエンディアンと型変換についての深い理解

C/C++ のエンディアンと型変換についての深い理解

Nov 17, 2016 pm 01:12 PM
c/c++

バイトオーダーと型変換を分けて話すと、誰もがとても簡単だと思うかもしれませんが、深く理解することはできません。それらを組み合わせて議論すれば、より深く理解できるかもしれません。

バイトオーダーと型変換の基本が理解できない場合は、次のブログを参照してください:

https://my.oschina.net/u/1783725/blog/647973 ラージバイトオーダーとスモールバイトオーダー

https://my.oschina.net/u/1783725/blog/700970 型変換

本題に入る前に、簡単な一文:

異なるシステム数字は、データ型の異なるバイトサイズに対応します

C/C++ のエンディアンと型変換についての深い理解

詳細 2 つの関係を紹介します

バイト オーダー: 操作のメモリは、メモリに表示されるデータを保存するための規則です。

ビッグ エンディアン: ビッグ エンディアンが有効、上位データが最初に下位アドレスのメモリに配置され、下位データが上位アドレスのメモリに配置されます。リトル エンディアン: リトル エンディアンが有効、下位データは最初に低アドレスのメモリに配置され、次に上位のデータが配置されます 上位アドレスのメモリに入力するとき

メモリを操作するとき (例: memcpy)、バイトオーダーを考慮する必要があります

C/C++ のエンディアンと型変換についての深い理解

型変換: 操作バイト変換サイズの種類に応じて、メモリから読み取られるデータであるデータを読み取ることです。

桁数が多いものは桁数の少ないものに変換(位置データを残して上位桁が切り捨てられます)、桁数が少ないものは桁数が多いものに変換されます(上位桁データは切り捨てられます) 0で埋めてください)。

C/C++ のエンディアンと型変換についての深い理解

それらを理解するための例

1. メモリ(memcpy)を操作する場合、割り当てはバイトオーダーを考慮する必要があります

1: unsigned long long型の0xABCDEF1234をunsigned longに割り当てます。 type 変数、バイトオーダーとは関係ありません

2: unsigned long Long 型 0xABCDEF1234 変数は、memcpy を使用して short 型変数を使用します。0 であることがわかり、バイトオーダーとは関係ありません

コードは次のとおりです:

#include <stdio.h>int main(int argc, char *argv[])
{
	unsigned long long ullVar = 0xABCD1234;	
	unsigned long ulVar1 = 0;	
	unsigned long ulVar2 = 0;	
	/*memcpy操作内存时,需要考虑系统的大小字节序,如果是大字节序的话,高位的数据保存在低地址上*/
	memcpy(&ulVar1,&ullVar,sizeof(ulVar1));	/*赋值时,就是讲读出的数据按照要赋值的数据类型的大小进行转换*/
	ulVar2 = ullVar;	printf("ulVar1=%x      ulVar2=%x \n",ulVar1,ulVar2); 
	//输出:ulVar1=0      ulVar2=abcd1234
	return 0;
}
ログイン後にコピー


このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

phpとc#の違いは何ですか phpとc#の違いは何ですか Jun 02, 2023 pm 01:45 PM

php と c# の違いは次のとおりです: 1. 言語の型システムが異なります。PHP は動的型ですが、C# は静的型です。 2. 使用されるプラットフォームが異なります。PHP はクロスプラットフォームを実現できますが、C# は Windows 専用です。 3. . プログラミングのパラダイムが異なり、PHP はオブジェクト指向、手続き型、関数型プログラミングをサポートし、C# はオブジェクト指向プログラミングに傾いている; 4. 実行速度が異なり、PHP の方が高速で、C# は比較的遅い; 5.アプリケーションのシナリオは異なります。PHP は Web 開発、サーバーなどに使用されます。C# は Windows デスクトップおよび Web アプリケーションに使用されます。

Clang ツールを使用して C/C++ コード整形ツールを作成する Clang ツールを使用して C/C++ コード整形ツールを作成する Aug 26, 2023 pm 01:09 PM

このチュートリアルでは、helpofclangtools を使用して C/C++ コード形式設定ツールを作成するプログラムについて説明します。SETUPsudoaptinstallpythonsudoaptinstallclang-format-3.5 次に、現在のユーザーが読み取りおよび書き込み権限を持つ場所に Python ファイルを作成します。例 importoscpp_extensions=(".cxx",".cpp&

C/C++ では、構造体の sizeof が各メンバーの sizeof の合計と等しくないのはなぜですか? C/C++ では、構造体の sizeof が各メンバーの sizeof の合計と等しくないのはなぜですか? Aug 26, 2023 am 09:29 AM

sizeof() で取得される構造体型の要素のサイズは、個々のメンバーのサイズと必ずしも同じではありません。コンパイラは、アライメントの問題を回避するためにパディングを追加する場合があります。したがって、寸法が変更される可能性があります。パディングは、構造メンバーの後に大きいサイズのメンバーが続く場合、または構造の最後にある場合に追加されます。コンパイラが異なれば、アライメント制約のタイプも異なります。 C 標準では、全体的なアライメント構造は実装に依存します。ケース 1 この場合、double z の長さは 8 バイトであり、x (4 バイト) よりも大きくなります。したがって、さらに 4 バイトのパディングが追加されます。さらに、short 型データ y にはメモリ内に 2 バイトのスペースがあるため、余分な 6 バイトがパディングとして追加されます。サンプルコード #include<stdio.h>structmyS

vscode 構成 C/C++ 実行環境について詳しく説明した記事 [乳母レベルの指導] vscode 構成 C/C++ 実行環境について詳しく説明した記事 [乳母レベルの指導] Feb 27, 2023 pm 07:33 PM

VScode で C/C++ を開発するにはどうすればよいですか? C/C++環境を構成するにはどうすればよいですか?次の記事では、VScode 構成 C/C++ 実行環境のチュートリアル (乳母レベルの指導) を紹介します。

C/C++ には、前置インクリメントと後置インクリメントの 2 つの操作があります。 C/C++ には、前置インクリメントと後置インクリメントの 2 つの操作があります。 Aug 25, 2023 pm 02:25 PM

ここでは、C または C++ におけるプリインクリメントとポストインクリメントとは何かを見てみましょう。前置インクリメントと後置インクリメントは両方ともインクリメント演算子です。しかし、それらの間にはほとんど違いはありません。前置インクリメント演算子は、まず変数の値をインクリメントしてから、それを他の変数に代入しますが、後置インクリメント演算子の場合は、まず変数に代入してから、値を増分します。例 #include<iostream>usingnamespacestd;main(){ intx,y,z; x=10; y=10;&nb

C/C++ では、strcpy() 関数は、ある文字列を別の文字列にコピーするために使用される関数です。 C/C++ では、strcpy() 関数は、ある文字列を別の文字列にコピーするために使用される関数です。 Sep 09, 2023 am 08:49 AM

関数 strcpy() は標準ライブラリ関数です。ある文字列を別の文字列にコピーするために使用されます。 C 言語では "string.h" ヘッダー ファイルで宣言され、C++ 言語では cstring ヘッダー ファイルで宣言されます。宛先へのポインタを返します。これは、C 言語の strcpy() の構文、char*strcpy(char*dest,constchar*src); strcpy() のいくつかの重要なポイントです。文字列全体をターゲット文字列にコピーします。文字列を追加するのではなく、文字列全体を置き換えます。ソース文字列は変更されません。以下は、C 言語での strcpy() の例です。 Example Online Demo#in

数値の階乗内の末尾のゼロの数を計算する C/C++ プログラム 数値の階乗内の末尾のゼロの数を計算する C/C++ プログラム Aug 29, 2023 pm 12:29 PM

ここでは、任意の数値の階乗結果の末尾のゼロの数を計算する方法を見ていきます。したがって、n=5 の場合は 5! =120。末尾の 0 は 1 つだけです。 20! の場合、20!=2432902008176640000 のように 4 つのゼロになります。最も簡単な方法は、階乗を計算して 0 をカウントすることです。ただし、n の値が大きい場合、このアプローチは失敗します。そこで、別のアプローチをとってみます。素因数が 2 と 5 の場合、末尾にゼロが表示されます。 2と5を計算すると結果が得られます。これを行うには、このルールに従います。 Trailing 0 = 階乗 (n) 素因数の 5 のカウント アルゴリズム countTrailingZeros(n)begin&

C/C++ で if ステートメントと else ステートメントを同時に実行する C/C++ で if ステートメントと else ステートメントを同時に実行する Sep 05, 2023 pm 02:29 PM

このセクションでは、C または C++ コードで if 部分と else 部分の両方を実行する方法を説明します。この解決策は少し難しいです。 if と else が続けて実行されると、あたかも if-else のないステートメントが実行されたかのようになります。ただし、ここでは、それらが存在する場合にそれらを順番に実行する方法を見ていきます。サンプルコード #include<iostream>usingnamespacestd;intmain(){ intx=10; if(x>5) { &

See all articles