请教Ushort类型的输出格式是什么
自己定义个头文件声明下,Windows,VC在windef.h下有这些定义: typedef unsigned long DWORD; typedef int BOOL; typedef unsigned char BYTE; typedef unsigned short WORD; typedef float FLOAT; typedef FLOAT *PFLOAT; typedef BOOL near *PBOOL; typedef BOOL far *LPBOOL; typedef BYTE near *PBYTE; typedef BYTE far *LPBYTE; typedef int near *PINT; typedef int far *LPINT; typedef WORD near *PWORD; typedef WORD far *LPWORD; typedef long far *LPLONG; typedef DWORD near *PDWORD; typedef DWORD far *LPDWORD; typedef void far *LPVOID; typedef CONST void far *LPCVOID; typedef int INT; typedef unsigned int UINT; typedef unsigned int *PUINT;
一个C++程序 输出数据类型长度
上面大魔导师的说法不对,用这个例子就可以知道:#include#includevoid main() { struct example { char b; char c; int d; double a; short e; short f;}y; cout} 输出仍然是24,按照大魔导师的说法,应该是28才对……目前找到的最好的解释为:这里涉及到字节对齐,字节对齐的细节和编译器实现相关,但一般而言,满足三个准则:1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。
在你的例子中:第一个double型占了8个字节,接下来的char b的偏移量是8,可以被sizeof(char)整除,因此它占用一个字节,char c偏移量是9,也占一个字节,int d偏移量是10,不是sizeof(int)=4的整数倍,要将其放到偏移量为12的位置,因此编译器在char c后填充了2个字节,使偏移量为12,int d占4字节,接下来的short e的偏移量为16,满足条件(2),short e占用2个字节,一共占用了18个字节,根据(3),编译器在short e后填充6个字节得到24字节;在我举的例子中,接下来再加1到3个short类型变量仍然为24个字节,但是如果添加4个short类型变量,则变为32个字节了更详细的全套说明在:http://blog.csdn.net/freefalcon/archive/2004/07/28/54839.aspx
汇编语言中,如何输出双字类型的数据
定义了一个函数指针类型为 LPREGISTERSERVICEPROCESS,函数返回值为 DWORD,参数为两个 DWORD 类型。
函数指针说起来比较麻烦,以带两个 int 参数的函数指针为例,一看就明白:#include typedef int (*PFNTEST)(int, int);int test1(int a, int b){return (a+b);}int test2(int a, int b){return (a-b);}int call(int i, PFNTEST pfn){return (*pfn)(i*i, i);}int main(){int m, n, p, q;PFNTEST pfnTest;pfnTest = &test1;m = (*pfnTest)(3, 5);pfnTest = &test2;n = (*pfnTest)(6, 2);p = call(4, test1);q = call(7, test2);printf("%d, %d, %d, %d.", m, n, p, q);return 0;}输出结果:8, 4, 20, 42.Windows SDK 定义:#define CALLBACK __stdcall其中采用 __stdcall 调用约定,可能是微软在 dll 内部对该函数指针也指明了这种调用约定,所以你声明的时候也需要指定,才能正确调用。
printf("%f\n",5)的输出结果为什么是0.000000
1,之所以没输出5,这是C语言设计的原因。
2,之所以输出0,这是计算机体系结构的问题。
具体来说:printf函数不会进行任何类型转换,它只是从内存中读出你所提供的元素的值(按照%d,%f等控制字符提示的格式)。
C语言设计中,int类型一般是32bit或者16bit,而float一般是64bit,并且有可能使用科学计数保存。
这点就和huhugo88所说一样,5在内存中为00000000,00000101。
而且5一般都在静态区,程序的静态存储区默认是0,那么当用%f来读时,就会读64bit,也就是会读之前的很多位0,最后按照(有效数字)*(基数2)pow(指数)的方式来取数,自然结果是0之所以Vc中不允许这种情况,而有些编译器就允许这么输出就是编译器设置的问题。
按理说,这样访问内存是属于越界访问,应该禁止。
不过只是读,伤害性不大而已。
西门子 PLC 中的数据类型的解释?? 比如BOOL 代表什么意思?
bool 布尔量 就是开关量 只有 0,1byte 字节word 字 16位整数dword 双字 32位整数int 带符号16位整数dint 带符号32位整数real 浮点数 实数 32位别的我没用过 适配器 就是plc 和电脑的 连接线 例如 MPI电缆
C++所有数据类型
你说的这是MFC的数据类型。
MFC中常见的数据类型如下:1、Win32程序共同使用的数据类型:BOOL:布尔值,取值为TRUE or FALSEBSTR:32-bit 字符指针BYTE:8-bit整数,未带正负号COLORREF:32-bit数值,代表一个颜色值DWORD:32-bit整数,未带正负号LONG:32-bit整数,带正负号LPARAM:32-bit整数,作为窗口函数或callback函数的一个参数LPCSTR:32-bit指针,指向一个常数字符串LPSTR:32-bit指针,指向一个字符串LPCTSTR:32-bit指针,指向一个常数字符串,此字符串可以移植到Unicode和DBCSLPTSTR:32-bit指针,指向一个字符串,此字符串可以移植到Unicode和DBCSLPVOID:32-bit指针,指向一个未指定类型的数据LPRESULT:32-bit数值,作为窗口函数或callback函数的返回值UINT:在Win16中是一个16-bit 未带正负号整数,在Win32中是一个32-bit 未带 正负号整数,WNDPROC:32-bit指针,指向一个窗口函数WORD:16-bit 整数 ,未带正负号WPARAM:窗口函数或callback函数的一个参数,在Win16中是16-bit,在Win32中是32-bit2、MFC独特的数据类型POSITION:一个数值,代表collection对象(例如数组或链表)中的元素位置,常 用于MFC collection classes(即数据处理类,如CArray)LPCRECT:32-bit指针,指向一个不变的RECT结构
C语言中为何整型变量以实型变量输出为0?
1、整形数和浮点数在内存中的存储格式和布局不同(理解浮点数的内存布局和表示方式,请参考:http://blog.csdn.net/songjinshi/article/details/7753777)2、printf在进行参数入栈时是根据实参的类型进行入栈,而不是根据格式化字符中指定的类型,具体入栈过程如以下所示。
所以造成入栈实参的类型和实际函数使用的类型不匹配(关键是所占内存的大小不同),所以在具体的解析中就会出现如题所说的结果,因为整形的内存布局在被解析为浮点数时会非常小,因为整形本来是4个字节存储,而被解析为8个字节的浮点数,所以所得的值会非常小,正如浮点数的的表示:非规格化:当E的二进制位全部为0时,N为非规格化形式。
注意,此时小数点左侧的隐含位为0。
为什么e会等于(1-bias)而不是(-bias),这主要是为规格化数值、非规格化数值之间的平滑过渡设计的。
后文我们还会继续讨论。
有了非规格化形式,我们就可以表示0了。
把符号位S值1,其余所有位均置0后,我们得到了 -0.0; 同理,把所有位均置0,则得到 +0.0。
非规格化数还有其他用途,比如表示非常接近0的小数,而且这些小数均匀地接近0,称为“逐渐下溢(gradually underflow)”属性。
下面贴出两段反汇编代码,解析参数如何入栈: printf("%f",45);00405028 mov esi,esp 0040502A push 2Dh 0040502C push offset _ORDER_SERVER_ADDRESS-0ACh (43F2ACh) 00405031 call dword ptr [__imp__printf (43C124h)] 00405037 add esp,8 printf("%f",d);(d为整形变量)00405028 mov esi,esp 0040502A mov ecx,dword ptr [d] 0040502D push ecx 0040502E push offset _ORDER_SERVER_ADDRESS-0ACh (43F2ACh) 00405033 call dword ptr [__imp__printf (43C124h)] 00405039 add esp,8 0040503C cmp esi,esp 0040503E call _RTC_CheckEsp (439760h) double a=5,c; float b; int d=0x40a00000,y=6; int *p; char s=5; p=&d; b=(float)a; printf("%f,%f,%f,%f,%f,%f,%d",b,c,(float)d,s,(float)s,y,y);00405028 mov esi,esp0040502A mov ecx,dword ptr [y]0040502D push ecx 0040502E mov edx,dword ptr [y]00405031 push edx 00405032 movsx eax,byte ptr [s]00405036 mov dword ptr [ebp-34h],eax00405039 fild dword ptr [ebp-34h]0040503C sub esp,80040503F fstp qword ptr [esp]00405042 movsx ecx,byte ptr [s]00405046 push ecx 00405047 fild dword ptr [d]0040504A sub esp,80040504D fstp qword ptr [esp]00405050 sub esp,800405053 fld qword ptr [c]00405056 fstp qword ptr [esp]00405059 fld dword ptr [b]0040505C sub esp,80040505F fstp qword ptr [esp]00405062 push offset _ORDER_SERVER_ADDRESS-0C4h (43F2ACh)00405067 call dword ptr [__imp__printf (43C124h)]0040506D add esp,30h00405070 cmp esi,esp00405072 call _RTC_CheckEsp (439780h)
MFC对话框输出信息表示
你应该将这个列表框关联一个CListCtrl类型的变量;如CListCtrl m_ctlList;然后在对话框的OnInitDialog()函数中,增加三个标题头,通过调用CListCtrl的int InsertColumn(int nCol, LPCTSTR lpszColumnHeading, int nFormat = LVCFMT_LEFT, int nWidth = -1, int nSubItem = -1 )方法;参数: nCol 新建列的索引值。
pColumn 包含新建列属性的LVCOLUMN结构的地址。
lpszcolumnHeading 包含列标题的字符串的地址。
nFormat 指定列对齐方式的整数。
它为下列值之一:LVCFMT_LEFT,LVCFMT_RIGHT或LVCFMT_CENTER。
nWidth 以像素为单位的列宽。
如果该参数为-1,那么没有设置列宽。
nSubItem 与列相关联的子项的索引。
如果该参数为-1,那么没有子项与列相关。
如:m_ctlList.InsertColumn(0,"食品"LVCFMT_LEFT,95);//插入表头标题m_ctlList.InsertColumn(1,"价格"LVCFMT_LEFT,95);//插入表头标题m_ctlList.InsertColumn(2,"金额"LVCFMT_LEFT,95);//插入表头标题然后,你在为“确定”按钮添加事件处理函数;在响应函数中:1.首先调用UpdateData(TRUE);更新控件上的值2.获取各个控件上的值,(用GetDlgItemText()函数)3.然后插入到列表框当中,调用CListCtrl的int InsertItem(int nItem,LPCTSTR lpszItem)函数如: m_ctlList.InsertItem(0,“面包”); m_ctlList.InsertItem(1,“20元”);大题思路就是这样的;附录:CListCtrl::InsertItemint InsertItem(const LVITEM* pItem)int InsertItem(int nItem,LPCTSTR lpszItem)int InsertItem(int nItem, LPCTSTR lpszItem,int nImage)int InsertItem(UINT nMask, int nItem, LPCTSTR lpszItem, UINT nState, UINT nStateMask, int nImage, LPARAM lParam )返回值:如果成功,则返回新建列的索引值,否则为-1。
参数: pItem 指向指定项属性LVITEM结构的指针,如联机文档“平台SDK”中所述。
nItem 被插入项的索引值。
lpszItem 包含项标签的字符串的地址,或当项为回调项时,该变量为LPSTR_TEXT CALLBACK。
要了解更多有关回调项的信息,请参阅CListCtrl::GetCall backMask. nImage 项图象的索引值,或当项为回调项时,该变量为I_IMAGECALLBACK。
要了解更多有关回调项的信息,请参阅CListCtrl::GetCallbackMask nMask 参数nMask指定了哪个项属性作为参数传递是有效的。
它可以是联机文档“平台SDK” 中LVITEM结构所描述的一个或多个掩码值。
有效的数据能够通过位与运算来组合。
nState 指示项的状态、状态图象及轮廓图象。
请参阅联机文档“平台SDK”中的LVITEM来获取更多信息,并参阅有效标志列表中的列表视图项状态。
nStateMask 指示状态成员中的哪一位将被获取或修改。
请参阅联机文档“平台SDK”中的LVITEM来获取更多信息。
nImage 图象列表之内项的图象的索引。
lParam 与项相关联的应用指定的32位值。
如果该参数被指定,那么必须设置nMask的属性为LVIF_PARAM。
说明:向列表视图控件中新插入一项。
附录2:CListCtrlCObject └CCmdTarget └CWnd └CListCtrl CListCtrl类封装“列表视图控件”功能,显示每个包含图标(列表视图中)和标签的收集。
除图标和标签外,每一项还能有显示在图标和标签的右边的列中的信息。
此控件(以及CListCtrl类)只适用于运行于Windows 95和Windows NT 3.51及更高版本的程序。
下面是CListCtrl类的主要概况。
对于详细的、概念性的讨论,请参阅联机文档“Visual C++程序员指南”中的“使用ClistCtrl”和“控件主题”。
视图列表视图控件可用四种不同方式显示其内容,称为“视图”。
· 图标视图每一项以全尺寸图标(32*32像素)出现,下面有一个标签。
用户可在列表视图窗口拖动项到任意位置。
· 小图标视图每一项以小图标(16*16像素)出现,右边有一个标签。
用户可在列表视图窗口拖动项到任意位置。
· 列表视图每一项以小图标出现,下面有一个标签。
项按列排列,不能拖动到列表视图窗口的任何位置。
· 报表视图每一项在本行上出现,右边有排列成列的附加信息。
最左边的列包含小图标和标签,下一列包含应用指定的子项。
嵌入标题控件实现这些列。
要了解报表视图标题控件和列的更多信息,请参阅联机文档“Visual C++程序员指南”中的“使用CListCtrl:给控件添加列(报表视图)”。
控件的当前列表视图风格指定当前视图。
要了解这些风格及其用法的更多信息,请参阅联机文档“Visual C++程序员指南”中的“使用CListCtrl:改变列表控件风格”。
扩展风格除了标准列表风格,类CListCtrl支持一系列提供丰富功能的扩展风格。
此功能的一些示例包括: · 逗留选择有效时,若光标保持在某项上一段时间,则允许自动选择该项。
· 虚列表视图如果有效,允许控件支持DWORD项。
通过把管理应用项数据放在最顶上而成为可能。
除了项选择和焦点信息,所有项信息必须由应用管理。
要了解更多信息,请参阅联机文档“Visual C++程序员指南”中的“使用CListCtrl:虚列表控件”。
· 单击或双击激活如果有效,允许热跟踪(项文本自动高亮显示)和高亮显示项的单击和双击激活。
· 拖放列表命令如果有效,允许拖放...
vs2010中如何输出图形
我这有几个函数你看看CreateCompatibleDC 函数功能 该函数创建一个与指定设备兼容的内存设备上下文环境(DC)。
通过GetDc()获取的HDC直接与相关设备沟通,而本函数创建的DC,则是与内存中的一个表面相关联。
函数原型 HDC CreateCompatibleDC(HDC hdc); 参数 hdc:现有设备上下文环境的句柄,如果该句柄为NULL,该函数创建一个与应用程序的当前显示器兼容的内存设备上下文环境。
返回值:如果成功,则返回内存设备上下文环境的句柄;如果失败,则返回值为NULL。
Windows NT:若想获得更多错误信息,请调用GetLastError函数。
注释:内存设备上下文环境是仅在内存中存在的设备上下文环境,当内存设备上下文环境被创建时,它的显示界面是标准的一个单色像素宽和一个单色像素高,在一个应用程序可以使用内存设备上下文环境进行绘图操作之前,它必须选择一个高和宽都正确的位图到设备上下文环境中,这可以通过使用CreateCompatibleBitmap函数指定高、宽和色彩组合以满足函数调用的需要。
当一个内存设备上下文环境创建时,所有的特性都设为缺省值,内存设备上下文环境作为一个普通的设备上下文环境使用,当然也可以设置这些特性为非缺省值,得到它的特性的当前设置,为它选择画笔,刷子和区域。
CreateCompatibleDc函数只适用于支持光栅操作的设备,应用程序可以通过调用GetDeviceCaps函数来确定一个设备是否支持这些操作。
当不再需要内存设备上下文环境时,可调用DeleteDc函数删除它。
ICM:如果通过该函数的hdc参数传送给该函数设备上下文环境(Dc)对于独立颜色管理(ICM)是能用的,则该函数创建的设备上下文环境(Dc)是ICM能用的,资源和目标颜色间隔是在Dc中定义。
CreateCompatibleBitmap 函数功能:该函数创建与指定的设备环境相关的设备兼容的位图。
函数原型:HBITMAP CreateCompatibleBitmap(HDC hdc,int nWidth,int nHeight); 参数: hdc: 设备环境句柄。
nWidth:指定位图的宽度,单位为像素。
nHeight:指定位图的高度,单位为像素。
返回值:如果函数执行成功,那么返回值是位图的句柄;如果函数执行失败,那么返回值为NULL。
若想获取更多错误信息,请调用GetLastError。
备注:由CreateCompatibleBitmap函数创建的位图的颜色格式与由参数hdc标识的设备的颜色格式匹配。
该位图可以选入任意一个与原设备兼容的内存设备环境中。
由于内存设备环境允许彩色和单色两种位图。
因此当指定的设备环境是内存设备环境时,由CreateCompatibleBitmap函数返回的位图格式不一定相同。
然而为非内存设备环境创建的兼容位图通常拥有相同的颜色格式,并且使用与指定的设备环境一样的色彩调色板。
fillsolidrect void FillSolidRect( int x, int y, int cx, int cy, COLORREF clr ); 参数: lpRec 指向RECT数据结构的指针,包含被填充的矩形的逻辑坐标,可以为该参数传递RECT数据结构或CRect对象的指针。
clr 指定填充矩形使用的颜色。
x 矩形左上角的X逻辑坐标。
y 矩形左上角的Y逻辑坐标。
cx 指定矩形的宽度。
cy 指定矩形的高度。
说明: 调用该成员函数用指定的固体色填充矩形。
FillSolidRect与CDC::FillRect类似,FillSolidRect只能使用固体色(由COLORREF参数决定)。
但FillRect带有画刷,因此可以为矩形填充固体色、抖动色、阴影或使用调色板。
FillRect通常比FillSolidRect慢。
注意:调用FillSolidRect时,以前用SetBkColor设置的背景色,被设置为clr指定的颜色。
Detach detach()函数: MFC类里CMENU类的成员函数。
功能是切断一个CWnd对象和一个有效窗口的联系。
由于WNDCLASS其实和CWnd根本没有什么关系,它们之间只是通过CWnd的成员HWND联系起来的。
Detach的作用是切断一个CWnd对象和一个有效窗口的联系。
因为CWnd是C++的对象,C++的对象有一个生存期的概念,脱离了该对象的作用域,这个对象就要被销毁,但是Windows对象没有这个特点,当销毁CWnd对象的时候,我们不一定希望WNDCLASS一起被销毁,那么在此之前,我们就先要把这个联系切断。
当我们建立了一个局部的菜单对象后,比如 在一个窗口类的函数里建立了一个局部菜单对象,当这个窗口函数的生命周期结束时,如果不希望菜单对象也被销毁,就要用detach()函数把菜单句柄和这个菜单对象分离。
这样,当局部的菜单对象被销毁时,它不会销毁一个它不具备拥有权的菜单。
GetClientRect 函数功能该函数获取窗口客户区的坐标。
客户区坐标指定客户区的左上角和右下角。
由于客户区坐标是相对子窗口客户区的左上角而言的,因此左上角坐标为(0,0) 函数原型在Win32 SDK, 该API函数原型为 BOOL GetClientRect( HWND hWnd, // 窗口句柄 LPRECT lpRect // 客户区坐标 ); 在MFC中,该函数的原型为void GetClientRect(LPRECT lpRect) const; 参数hWnd [输入]是程序窗口的句柄。
lpRect [输出]是一个指针,指向一个RECT类型的rectangle结构。
该结构有四个LONG字段,分别为left、top、right和bottom。
GetClientRect将这四个字段设定为窗口显示区...