两个无符号类型想减结果存储的临时变量还是无符号类型

 1 #include <stdio.h>
 2 int main()
 3 {
 4     unsigned int dwVal = 0;
 5     unsigned __int64 n64Val = 1;
 6     if( dwVal - n64Val >= 20)
 7     {
 8         printf("%I64d\n",dwVal - n64Val);        //执行这行,输出 -1
 9     }
10     return 0;
11 }

个人分析:

在做想减操作(dwVal - n64Val)时,会将dwVal和n64Val都转换为unsigned __int64,
两者想减的结果为-1,存储为0xFFFFFFFFFFFFFFFF,当成unsigned __int64使用
与 后面的数字(20)进行比较,所以计算结果为true,而打印输出的结果是 __int64类型
对应值为-1

进一步验证:

 1 #include <iostream>
 2 int main()
 3 {
 4     unsigned int dwVal = 0;
 5     unsigned __int64 n64Val = 1;
 6     unsigned __int64 n64Val2 = 0xffffffffffffffff;
 7     if( dwVal - n64Val >= n64Val2)
 8     {
 9         printf("%I64d\n",dwVal - n64Val);        //执行这行,输出 -1
10     }
11     n64Val2 = dwVal - n64Val;        //n64Val2 = 0xffffffffffffffff
12     system("pause");
13     return 0;
14 }
 1 #include <iostream>
 2 int main()
 3 {
 4     unsigned int dwVal = 0;
 5     unsigned __int64 n64Val = 2;
 6     unsigned __int64 n64Val2 = 0xffffffffffffffff;
 7     if( dwVal - n64Val >= n64Val2)
 8     {
 9         printf("%I64d\n",dwVal - n64Val);        //执行不到这里
10     }
11     n64Val2 = dwVal - n64Val;        //n64Val2 = 0xfffffffffffffffe,小于n64Val2
12     system("pause");
13     return 0;
14 }

有感于GetTickCount() 49.7天后计数置零

_LogTick = ::GetTickCount64();

    //DoSomething;

    if(::GetTickCount() - _LogTick >= LOG_TICK_MAX)
    {
        printf("%I64d\n",::GetTickCount() - _LogTick);
    }
时间: 2024-10-09 14:33:57

两个无符号类型想减结果存储的临时变量还是无符号类型的相关文章

不允许创建临时变量交换两个变量的内容

在学习C语言的时候,涉及到两个变量值的交换,其中用到临时变量.如果在没有临时变量的情况下,该如何做呢? 方法一:C语言提供的异或运算就可以实现这样的操作.异或运算符"^"也称"XOR"运算符,它的规则是:若参加运算的两个二进位同号,则结果为0(假):异号为1(真). 即: 0 ^ 0 = 0,            0 ^ 1 = 1,            1 ^ 0 = 1,            1 ^ 1 = 0.       例如:a=5, b=9, 要想

不用临时变量,交换两个变量的值

在学习C语言的时候,涉及到两个变量值的交换,其中用到临时变量.类似于:temp=a;a=b;b=temp;这样的语句,如果在没有临时变量的情况下,该如何做呢?网络上的人们给出了两种方法:一.异或法a=a^b;b=b^a;a=a^b;二.加减法a = a + b; b = a - b; a = a - b;其实我们看加减法更容易理解,也有许多人用这种方法,虽然这些方法可能用不到,但是了解下还是有必要的,至少要读懂别人的代码是吧. 其实两个方法都类似,我们没有临时变量,就自己用一个来做临时变量(相当

JavaScript不用临时变量交换两个变量的值的七种解决方案

前言 这篇文章总结了七种办法来交换a和b的变量值 var a = 123; var b = 456; 交换变量值方案一 最最最简单的办法就是使用一个临时变量了,不过使用临时变量的方法实在是太low了 var t; t = a; a = b; b = t; 首先把a的值存储到临时变量中,然后b赋值给a,最后拿出临时变量中的a值赋给b,这个办法是最基本的了 交换变量值方案二 下面的方案都不会有临时变量,我总结了一下,其实不使用临时变量的思路都是让其中一个变量变成一个a和b都有关系的值,这样可以先改变

处理unsigned想减错误(BIGINT UNSIGNED value is out of range)

mysql 当两个字段想减时,如果其中一个或两个字段的类型的unsigned无签名类型,如果想减的值小于0则会报错(BIGINT UNSIGNED value is out of range) 测试: select cast(1 as unsigned)-2 select 0-cast(1 as unsigned) 解决办法: 一.修改字段类型 二.使用cast函数转字段为signed类型 select cast(1 as signed)-2

交换两个数内容,无临时变量(初)

//交换内容,无临时变量(初) #include<stdio.h> int main() {    int a=10;    int b=20;    a=a+b;    b=a-b;    a=a-b;    printf("a=%d\n",a);    printf("b=%d\n",b); return 0; }

Day 2 : 变量、JAVA基本类型、运算符和表达式-1

1. 变量 1.1. 什么是变量 在日常生活中,人们会用到大量数据,像去ATM机取款,首先,需要插入银行卡,这个过程其实就是ATM机的系统在获取银行卡号这个数据,而后,输入密码,这个过程也是在获取数据,也就是密码.在后续进行的业务处理中,像存钱.取钱.转帐汇款等等,银行卡号和密码会被反复的.频繁的使用, 那就需要一个存储这些数据的地方. 在软件系统中,是将数据存储在内存之中的,而对内存中的数据的引用就是变量,可以理解为变量就是内存中数据的代词. 简单说, 变量就是指代在内存中开辟的存储空间,用于

【javascript】详解变量,值,类型和宿主对象

前言 我眼中的<javascript高级程序设计> 和<你不知道的javascript>是这样的:如果<javascript高级程序设计>是本教科书的话, <你不知道的javascript>就是那本王后雄有以下两点: 1. 老师会教你: 考试最后的准备仍然要“回归课本”2. 在1的前提下并不妨碍我们希望拥有一本好用的“王后雄” JS数据类型 JS类型分类 讲到类型, 首先要说的当然是JS的类型分类, 对于这一点,<javascript高级语言程序设计&

语言中结构体变量和结构体类型的定义

1.结构体类型定义 定义方式1: Typedef struct  LNode {    int  data;  // 数据域    struct LNode   *next;  // 指针域 } *LinkList; 定义方式2: struct  LNode {    int  data;  // 数据域    struct LNode   *next;  // 指针域 }: Typedef struct  LNode  *LinkList; 以上两个定义方式是等价的,是将*LinkList定义

Python、C++中编写函数以及不使用临时变量交换两变量值的比较

在C++中,交换两变量的值一般第一反应都会是如下的代码: { temp=a; a=b; b=temp } 但是题目要求不允许使用临时变量temp呢?可能就需要想一会了.但也有解决办法: { b=a+b; a=b-a; b=b-a; } 这种做法在a和b数值较小的情况下是对的,但是a+b如果很大则会溢出,所以也不是最优的解法.最好的方法是使用异或: { a ^= b b ^=a a ^=b } 在Python中这个问题就太弱智啦! a,b=b,a 直接一行搞定! 如果题目要求编写一个函数来交换两变