#define socket_t int*
#define INVALID_SOCKET (socket_t)(~0)
#define SOCKET_ERROR (socket_t)(-1)
#define INVALID_SOCKET (int)(~0)
#define SOCKET_ERROR (int)(-1)
#define INVALID_SOCKET (uint32_t)(~0)
#define SOCKET_ERROR (uint32_t)(-1)
问题1:看源码,看到这两个值,发现上面6行值都是 -1。
~0 按位取反不应该是int最大值吗?
if(INVALID_SOCKET < 0) {
printf("INVALID_SOCKET less than 0 \r\n");
} else {
printf("INVALID_SOCKET bigger than 0 \r\n");
}
问题2:如果 SOCKET_ERROR 定义成 (socket_t)(-1) 或者 (socket_t)(~0) ,这个值与0 比较,
它总是大于0的。
如果 SOCKET_ERROR 定义成 int 或 uint32_t ,与0比较,就是小于0的。
这是为什么?
问题2:如果 SOCKET_ERROR 定义成 (socket_t)(-1) 或者 (socket_t)(~0) ,这个值与0 比较,
它总是大于0的。
如果是 int* ,这是对的,指针不存在负值,-1 在指针类就是最大值。
*
如果 SOCKET_ERROR 定义成 int 或 uint32_t ,与0比较,就是小于0的。
这是为什么?
*
int是对的,-1 小于0 。
*
unint32_t 类如果小于0,你大概用了一个假的编译器。-1 在所有无符号类整数,都是最大值。
0是二进制每一位都是0,那么~0就是取反,每一位取反后都是1
-1也是二进制每一位都是1
所以两者是相等的
计算机负数是用补码表示的,具体讲啥是补码,比较啰嗦,简单说补码,就是原码求反加1,所以-1的原码是0001(这里按4位整形举例,32位类似) ,取反就是1110,再加1就是1111,就是F,32位一样就是0xFFFFFFFF.
谢谢各位的回答。