关于c++ short转float内存中值的问题
short sn = 0x0101;   //257
int in1 = 0x01010000;
int in2 = 0x00000101;
float fn1 = *(float *)&sn;
float fn2 = *(float *)&in1;
float fn3 = *(float *)&in2;
cout << (fn1 == fn2 ? 1 : 0) << " " << (fn1 == fn3 ? 1 : 0);
  • 上述代码输出为0 0,说明在内存中float不是直接取short作为头部或尾部
  • 实际内存中的值发生了什么变化?
  • 如果short为负数呢?

4个回答

用指针强行转换认的是对应内存的值。浮点数是由符号、尾数、阶码、阶码的符号组成的,不是直接转换那么简单。short为负数本质上只是short的最高位是1,别的位是这个short绝对值取反+1

qq_36685766
qq_36685766 回复caozhy: 谢谢
接近 3 年之前 回复
caozhy
贵阳老马马善福专门编写代码的老马就是我! 回复qq_36685766: float是32bit的,short是16bit的,但是有的编译器变量会按照32bit对齐,所以0x0101后面是什么就不一定了。如果用vc++,可以调试的时候打开内存看下
接近 3 年之前 回复
qq_36685766
qq_36685766 关于浮点数是由符号、尾数、阶码、阶码的符号组成的这个我知道,(float)in1这种转换方式我也懂,负数补码也清楚。就是想知道为什么上述代码的运行结果是那样而已
接近 3 年之前 回复

在short sn = 0x0101;的前面多定义一个变量short s=0x0000;
也许就能得到期望的结果了。

运行的时候打开内存管理,你会发现sn的地址上保存的是01 01,而fn1保存的是01 01 cc cc,这是因为short只有16位,而float有32位,fn2和fn3分别是00 00 01 01和01 01 00 00(注意这里都是16进制,而且是内存管理中!),让fn2和fn3分别与fn1比较当然会不相等,所以程序运行结果是0 0
图片说明
这是sn的地址,但只有4个位置(都是16进制)
图片说明
in1
图片说明
in2
图片说明
fn1 这里fn1因为是float,所以读的时候应该取32个比特位,所以后面的cc cc也就是随机值
图片说明
fn2 与in1相同
图片说明
fn3 与in2相同
这就是在程序运行过程中的内存的变化,你看看吧~

float,double和整形的存储方式是不同的

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
关于内存中值的问题
int 类型的值 1rn为什么在内存里的值为 0x 01 00 00 00 呢???rnrn如果为补码,好像也不对嘛?怎么算的?rnrn-1的值到是对了,0x ffff ffffrnrn补码不是取反加1吗?为什么1 就不对了?
c字符串转float的问题
[code=C/C++]rn#includern#includernint main(void)rnrn float x=0.0;rn char *pch="123.456";rn rn x=atof(pch);//使用strtod 函数 出现相同的错误信息 求解rn prinf("%f\n",x);rnrn return 0;rn[/code]rnrn运行后程序报错:rn[color=#FF0000]scanf:floating point formats not linkedrnabnormal program termination[/color]rnrnrn[b]我用的是turbo c 2.01rnrn这个错误信息是什么意思?如何解决?[/b]
float和unsigned short
情况一:rnunsigned short a=98;rnfloat b=6.25e+007;rn rna+=b;rncout<
关于Float转INT的问题?
ADOTable调用视图时的问题,SQL视图本身是没问题的,但由于里面有0,rnrn而本来在Delphi中的值应该是Float的,但现在由于是0,所以出现以下的问题,请问这种情况一般怎么解决?rnrn谢了.rnrnexpecting:Float actual:Integer'
关于CString转float的问题
rn菜鸟的提问rnVS2008中 我想把CString转换成floatrn代码如下rnCString str=_T("45.2")rnfloat f = (float)tstof(str);rnrn转换后的结果f=45.200001rn我想要的结果是45.2,请问该怎么写?
关于byte[]转Float
大家好~ 我是通过如下方式转换 Float值为byte数组rnrn我接收此信息的时候该怎么从byte 转到原来的 数据呢 rnrnpublic byte[] valueStringToByte(String value) rn rn // according to the defination of protocol, convert float value to int firstrn // need calculate round value.rn Float f = Float.parseFloat(value);rn int i = Math.round(f);rn rn byte[] bt = new byte[4];rn bt[0] = (byte) (0xff & i);rn bt[1] = (byte) ((0xff00 & i) >> 8);rn bt[2] = (byte) ((0xff0000 & i) >> 16);rn bt[3] = (byte) ((0xff000000 & i) >> 24);rn rn return bt;rn
关于Char转化为Short的问题!
现在我有Char型的字符;想一抹一样转化为Short类型的;rn列:Char:'0xd4ef' 如何转化为 Short型的 0xd4ef;rn急,谢谢了!
short,int ,long,float取值范围
在IEEE754标准下探讨short,int ,long,float取值范围,文档中包含一段验证程序,在VC6.0环境下编译通过,全面展示short,int ,long,float取值范围,以及double取值范围的推广。
byte[] 与short、float、double的相互转换
public class ShortFloatDoubleToByte { /** * double To byte[] * @param d * @return */ public static byte[] double2Bytes(double d) { long value = Double.doubleToRawLongBits(d); byte[] byte...
【C语言】float转化为int的问题
```rn#include rnint main() rnfloat x;rnx=10/4;rnprintf("%d",x);rnrn```rn# 输出:0rn为什么是0啊?如果%d表示整型,不应该是2吗?
c中值传递问题
有点郁闷,想不通,发帖寻解释rn大家知道,c里面是值传递,因此rn[code=C/C++]rnint main()rn void exchang(int a,int b)rn int w=0;rn w=a;a=b;b=w;rn rn int x=1,y=2;rn exchang(x,y);rn printf("x=%d,y=%d",x,y);rn rnrn[/code]rn这个程序并不能交换x和y的值,因为在exchang内部参数是值传递的,实际改变的是exhcang内的临时变量rn再看这个rn[code=C/C++]rnint main()rn void test(int m)rn m=12;rn rn int a=1;rn test(a);rn printf("a=%d",a);rnrnrn[/code]rn因为是值传递,m是a的一个拷贝,函数改变的是m的值,而不是a的值,所以a应该还是1,但输出却是12;不明白啊rn还有,如果用宏的话rn[code=C/C++]rn#define testx(m,n) int a=0;(a)=(m);(m)=(n);(n)=(a);rnint main()rn int x=1,y=2;rn testx(x,y);rn printf("x=%d,y=%d",x,y);rnrnrn[/code]rn确能交换x和y的值,不明白 求解释
float转int的问题
float fTest = 1.234567e14;rnint nTest = 0;rnnTest = fTest;rnrn这样的赋值会把浮点数的哪几位赋给整型呢?谢谢!
关于float在内存中的存储方式
最近在网上看到一片float存储 有点疑问:rnrn 8.25用二进制表示可表示为1000.01, 科学计数法表示1000.01可以表示为1.00001*2的3次方 rnrn这样8.25在内存的存储就为 0 1000 0010 000 0100 0000 0000 0000 0000rnrn根据这个结论rnrn2.25的单精度存储方式应该是: 0 1000 0000 001 0000 0000 0000 0000 0000rnrnrn而看到别人的是 "2.25的单精度存储方式,很简单 0 1000 0001 001 0000 0000 0000 0000 0000"rnrn想知道 到底是谁的对, 如果是我错了 那错在哪里呢 谢谢大家
String 转 float 问题
String a = "1000000000";rnrnfloat b = Float.parseFloat(a);rnrnSystem.out.println(b);rnrnrn会输出 1.0E8rnrn我现在想输出正常的数字,怎么解决?
string 转 float 的问题
string WaterMark_ImageTransparency = "0.50";rn float ImgalphaColor;rn tryrn rn ImgalphaColor = (float)(double.Parse(WaterMark_ImageTransparency));rn rn catchrn rn ImgalphaColor = 0.1f;rn rn Label1.Text = ImgalphaColor.ToString();rnrn如何让Label1.Text显示WaterMark_ImageTransparency的值?rn我搞来搞去总是不对catch会抛出一个错误 input string was not in a correct format
计算机内存类型如何转float值?
float型转计算机内存表示我会:比如rn2.5表示为:0x00002040rn但是如何反过来转换呢?
float转double问题
c# 小数 float类型转double类型 ,转了后精度丢失,有没有比较好的办法呢
C# Byte数组转Int32 Short Float(浮点数)
C# Byte数组 数值转花 Int32 Short Float 浮点数 自己写的Test 有问题可以联系我
C语言double 型数组转short
举个例子如下,为什么程序无法运行。rn#include "stdio.h"rn#include "stdlib.h"rnrnint main()rnrn int i,j;rn short *T;rn double **X;rn X = (double **)malloc( sizeof(double*) * 10000); rn for(i=0;i<10000;i++)rn rn for(j=0;j<2;j++)rn rn X[i][j] = -0.003+0.2*(j+1);rn rn rn T = (short *)malloc( sizeof(short) * 10000); rn for(i=0;i<10000;i++)rn rn T[i] = (short)(X[i][0]*3000);rn rn rn for(i=0;i<10000;i++)rn rn printf("%d", T[i]);rn printf("\n");rn rn rn free(X);rn X=NULL;rn free(T);rn T=NULL;rn rn return 0;rn rnrn
关于string转化为float, 在float转化为int
我发现一个问题,在C语言中,我把一个"123.23" string 转化为 float 的 123.23rn后, 在rnrn#include rnrnfloat chartofloat(char *p)rnrn......rn......rnrnrnvoid main(void)rnrnchar *p = "123.23";rnfloat f;rnint k;rnf = chartofloat(p);rnrn/* convert float to int and print int */rnprintf("f = %f\n", f);rnk = f;rnprintf("k = %d.", k);rnk = (f - k) * 1000;rnrnprintf("%d\n", k);rnrnrn输出结果:rn f = 123.23rnrn k = 123.229rnrn主要我发现我在把float转化为int时,出现了问题。rn我希望输出的结果:rnrn f = 123.23rnrn k = 123.23rnrn但输出的是上面的请给位帮我解释!!rnrnrnrnrnrnrn
关于float转double的小问题
MFC程序如下:rn float f1=123.567f,f2=123.5f;rn double fd1,fd2;rn fd1=(double)f1;rn fd2=(double)f2;rn调试运行结果:rn fd1=123.56700134277344rn fd2=123.50000000000000rnrn请问为什么f小数点后面会出现“134277344”这些数?rn如何更改才能使得这些数不出现?使得准确输出123.56700000000000rn如果说要我把后面的小数一位位的重新处理的话那就算了。
关于int转换为float
有谁晓得怎么将一个int转换为float型啊?rn急!!!!!!!!
关于jmp short 问题
jmp short 位移范围是-128~127 为什么我执行超过127字节没有错,还是我的理解错误代码如下rnrn ASSUME CS:CODE,DS:DATArnDATA SEGMENTrn DB 1,2,4,5,6rn rnDATA ENDSrn rnCODE SEGMENT rn START: INC AXrn JMP S0rn MOV BX,3rn MOV BX,3rn MOV BX,3rn MOV BX,3rn MOV BX,3rn MOV BX,3rn MOV BX,3rn MOV BX,3rn MOV BX,3rn MOV BX,3rn MOV BX,3rn MOV BX,3rn MOV BX,3/*长度3个字节*/rn [color=#FF0000] (这里复制50次 MOV BX,3)>127[/color] rn S0: INC BX ([color=#FF0000]为什么还可以跳到这里来执行[/color])rn JMP START rn rnCODE ENDSrnEND STARTrn
关于十六进制转float的疑问
我在msdn上看到rn 00-00-C0-FF = NaNrn 00-00-80-FF = -Infinityrn 00-00-80-7F = Infinityrn那么为什么00-00-C0-FF就等于NaN呢,rn那么00-00-C1-FF等于什么?rn为什么00-00-80-FF就是float的最小数?rn00-00-80-7F是最大?rn如果00-00-C0-FF实在float数中取得一个,那么rnfloat不就不连续了吗?rn这个应该从二进制转换上来说吧,我对二进制数不怎么了解,rn麻烦对二进制有研究的高手讲解一下。
问一下关于int转float的问题
int a = 870;rnfloat b;rnrn我该如何将整形变量a转化成浮点数b哦。。rnrnb应该= 8.70
关于float转int的函数实现
使用内存拷贝函数memcpy(),实现float转为int的函数功能。
关于short的问题
short s1 = 1;rns1 = s1 + 1;rnrns1 += 1;rnrnrn这两者为什么产生的结果不一样呢?希望能解释一下
求char[] 转 short[]
unsigned char[]转 unsigned short[] 和char[]转short[] 方法是一样的么??要考虑高低位什么的么
关于short问题
short s = 1;rn s= s+1;这个会报错 下面的不会 (强转后就不出错)s=(short)(s+1);rn rn s+=1; rn为什么!rn
short转换为字符串
函数名 long GetEventRecvSms(short * PhoneNumber, short * SMSContent);rn函数描述 取模块中的短信接收事件rn参数描述 PhoneNumber 短信发送号码rn SMSContent 短信内容rnrnrn请问C#里如何将这里的short类型转换为字符串类型呢?谢谢。
关于vc++ float + float的问题
附上源码rnrnrnatoi(tmp1_p1) + atoi(tmp1_p2)rnrnrn得出结果是 0.47000000 ,为什么老是保留两位rnrnrn实际上是 0.471344234
关于中值的问题
rn1rn2rnrn如何得到1或2
float转字节数组,再转float精度丢失的问题
碰到一个问题,需要设计二进制协议,float需要转成字节数组,然后再服务器端转成float,现在有这么一个数:rn282734.223 转成数组后是:0xC7 0x0D 0x8A 0x48,再转回来变成了 282734.22 小数点2位以后的都没了rn282734.2235555 转成数组跟上面结果一样, 转回来都丢失了精度rn请教正确的转换姿势
C里面float double在内存的存储方式
int型大小随系统变化char型和short固定为一个字节和两个字节,即在内存中存储方式为一个字节八位对应存储而float的大小为32位,占四个字节,并不按照一一对应的方式存储,其32位的由三部分构成,依次是符号位1  指数位8  数据部分23构成符号位用于表示正负指数位对应float数据类型的指数部分数据部分则是float数据类型底数部分指数部分为了方便比较,采用偏移码的方式使值存储为正数例如 ...
C语言 float问题
int i = 10;rn unsigned int ii = 2;rn result = 1.0 * (i >> 2);rn printf("%f\n", result);rnrn为何打印出的值没有小数位?
char数组转float问题
现有一字符串,例如:"cd 18 e9 42",是报文帧的一部分,实际是16进制的char数组,char ch[]=0xcd,0x18,0xe9,0x42;rn怎样转换成一个float数字,请帮我写一个函数谢谢!最好是参数直接传入字符串。请大家帮忙了!!!
请教字符串转float的问题
我想把字符串"0.1"转成0.1,用了下面的sql语句:rnselect convert(float,'0.1')rn但结果是:0.10000000000000001rn请问怎转成0.1,实际中小数后的位数是不定的rn
varchar 转 float及行列转换问题
有订单表如下rn名称(VARCHAR(40) 需求数量,备注(VARCHAR(400)rnA电线 100 红色25捆,兰色25捆,绿色30捆,黄色20捆rnrn希望得到的结果是如下,数量字段要求是FLOAT型rnA电线 红 25rnA电线 兰 25rnA电线 绿 30rnA电线 黄 20
int转化为float问题
在bcb6.0中 ,我想将整数转化为浮点数.小数位数由一个变量控制.rn搞了半天没转化成功,真丢脸.求教各位了
C关于内存的问题,多多指教!
如何编写一个模拟页式存储管理的程序,不要求真正调用内存的绝对地址,只用模拟就好,谢谢!!!
相关热词 c# 标准差 计算 c#siki第五季 c#入门推荐书 c# 解码海康数据流 c# xml的遍历循环 c# 取 查看源码没有的 c#解决高并发 委托 c#日期转化为字符串 c# 显示问号 c# 字典对象池