用户登录
用户注册

分享至

dword负数

  • 作者: 厷宔乄
  • 来源: 51数据库
  • 2020-04-21

一、C语言如何表示正负值问题

c语言有两种数据类型,一种是整型,一种是浮点型 ,整型类型一般用的原码表示,浮点类型一般用的IEEE754标准进行编码。

整型数中原码表示正负数,取最高位为符号位,以8位二进制数来表示1和-1。1的二进制为 0 000 0001 //最高位为符号位,0表示正数,1表示负数 1 000 0001 //这个表示-1 IEEE754浮点数编码,使用的格式类似于 (-1)^s * M* 2^E,其中s是符号位,M是有效位数,E指的是指数,s符号位占1位,如果是0,则(-1)的0次方为1,表示是一个正数,如果s位是-1,则表示是一个负数。

二、C语言中DWORD

DWORD 定义在

多数编译器 情况下 等于 unsigned int

但并不绝对,某些编译器 可能 是 unsigned long long

DWORD 应当是无符号数, 不是负数。

------------------------------------

unsigned int a= 0xfffffff4; // 无符号数

printf("%d %x %u",a,a,a);

MS VC++ 6.0 输出 为: -12 fffffff4 4294967284

所以: 无符号数 0xfffffff4 看成有符号整型数 输出 就是 -12

反过来说,DWORD -12 是 0xfffffff4

三、DWORD 是表示32位那它和int型有区别吗

long 32位有符号整数

int 32位有符号整数

DWORD 32位无符号整数

typedef unsigned long DWORD;

DWORD 一般用于返回值不会有负数的情况。

到底是用 int 还是 DWORD,要看具体情况。

例如你的 RecvDataThread 想用 -1 表示接收出错(Socket 函数很多也是用 -1 (SOCKET_ERROR) 的返回值代表失败,那么就应该用 int 返回值类型。

四、八进制数到底有没有负数

首先:八进制数的确是没有负数的

其次:我解释一下你说的现象

你的赋值其实赋的是十进制数 a = 21(即进制025) ;

b = 4294967275(16进制0FFFFFFEB,八进制37777777753) ;

(这里谢谢楼下提醒,原先写错了)

要赋成八进制数要写成 a = '\025' ; (我写成 a = \025 ; 编译错误)

八进制数是不能写负数的 也就是不能写成 '\-XXX' 的

我在Visual C++ 6.0 上写 '\-001'的时候出现编译错误

查看汇编代码 int b = '\-001' ;汇编代码为

mov dword ptr [ebp-8],2D303031h

也就是说 '\-001' 在计算机内是表示为 2D303031h 的,为什么会这样我就不知道了

但是可以说明一点:八进制是不能表示为负数的

至于计算机内是怎么运算的,你给的代码就是按十进制来算的,计算机内部的运算过程我想就不用给了吧.

为什么八进制没有负数,我的理解是:负数只是为了表示10进制数而出现的,而计算机内部就没有负数的概念,它就是几个二进制的位而已,所以就没必要弄出二进制的八进制,再次,它只是相当于对二进制的一个缩写,而二进制可以根据规则和十进制互换,所以没有负的。

希望你可以理解。

转载请注明出处51数据库 » dword负数

软件
前端设计
程序设计
Java相关