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)就对了.