一、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进制数而出现的,而计算机内部就没有负数的概念,它就是几个二进制的位而已,所以就没必要弄出二进制的八进制,再次,它只是相当于对二进制的一个缩写,而二进制可以根据规则和十进制互换,所以没有负的。
希望你可以理解。
厷宔乄