给出一个十六进制的数0xFF 0x80 (只有2“位”) 将其转换成有符号的一字节的十进制整数

#include <stdio.h>
#include<iostream>
#include <stdlib.h>
#include<string.h>
using namespace std;
int main()
{
char ch[8];
char ch2[8]={‘0‘,‘0‘,‘0‘,‘0‘,‘0‘,‘0‘,‘0‘,‘0‘};

ltoa(strtol("0xba",‘\0‘,16),ch,2);
//cout<<strlen(ch);
for(int i=8-strlen(ch),j=0;i<8;i++,j++)
{

ch2[i]=ch[j];
}

if(ch2[0]==‘1‘)
{
cout<<"minus:"<<endl;
cout<<"-"<<(256-strtol("0xba",‘\0‘,16)) <<endl;
}
else{
cout<<"+:"<<endl;
cout<<strtol("0xba",‘\0‘,16)<<endl;
}
return 0;
}

^(* ̄(oo) ̄)^:红色数字部分为const char*类型;

主要应用的函数为:strtol;ltoa

第一个函数是将第一个参数里的字符串转换为十进制,遇到\0结束,后边的数字2-36,指的是前边的字符串代表的数字进制,而不是将其转换为某进制。

strtol是将第一个参数的数字转换成第三个参数的进制并存入第二个参数的数组里。char *ltoa(long value,char *string,int radix)

原码,反码,补码,运算不介绍,这里只是采取投机取巧的方式。。。。

之所以用了ch2是因为ltoa只是把二进制从一开始的有效位赋给ch从零开始。前边如果有0 ,它并没有进行赋值。

例如:long(strtol)转换后的二进制为:00010101---》ltoa只把10101赋给了ch[0]=1,ch[1]=0,ch[2]=1,ch[3]=0,ch[4]=1....ch[5]=null.....以此类推。。。。。。

时间: 2024-08-09 13:53:22

给出一个十六进制的数0xFF 0x80 (只有2“位”) 将其转换成有符号的一字节的十进制整数的相关文章

给出一个非负整数 num,反复的将所有位上的数字相加,直到得到一个一位的整数。

1 package digitAddTogither; 2 3 /** 4 * Created by ZKY on 2017-08-15 01:00. 5 * 给出一个非负整数 num,反复的将所有位上的数字相加,直到得到一个一位的整数. 6 * 样例 7 * 给出 num = 38. 8 * 相加的过程如下:3 + 8 = 11, 9 * 1 + 1 = 2. 10 * 因为 2 只剩下一个数字,所以返回 2. 11 */ 12 public class DoMain 13 { 14 /**

ACM将一个十进制的数转换为一个十六进制的数输出

Description 把十进制整数转换为十六进制,格式为0x开头,10~15由大写字母A~F表示. Input 每行一个整数x,0<= x <= 2^31. Output 每行输出对应的八位十六进制整数,包括前导0. Sample Input 0 1023 Sample Output 0x00000000 0x000003FF   解题思路:我们把一个十进制的数转换为一个八位十六进制数只需在输出用%.8X就可以了.然后我们在每一次输出一个八位十六进制数之前都输出一个0x字符串就可以了. 程序

写了一个时间处理的类,能将人类时间转换成距离公元零年一月一日秒数(时间戳),同时支持时间戳转换成日期时间

1 #include "stdafx.h" 2 #include <stdlib.h> 3 #include <string.h> 4 #include <time.h> 5 6 #define IS_LEAP_YEAR(y) (((y) % 4 == 0 && (y) % 100 != 0) || (y) % 400 == 0) 7 8 #define if_not_eual_ret(left, right) do { 9 if (

设计一个函数将一个数字字符串转换为数字,如将”1024”转换成1024输出

#include <stdio.h>int convert(char *str){    int k=0;    while(*str!='\0')    {        k=k*10+(*str++)-'0';    }    return k;        } int main(int argc, const char * argv[]) {    char *str="45";        int a=atoi(str);    printf("%d\

温故知新,基础复习(一个有序从大到小不重复的数列,任意给出一个sum值,求出数列中所有满足和为sum的数对)

温故知新,基础复习(一个有序从大到小不重复的数列,任意给出一个sum值,求出数列中所有满足和为sum的数对) #include<stdio.h> #include<stdlib.h> void PrintSumNumbers(int Arra[],int ASize,int Sum) { //O(1) if (ASize<2) { printf("The size of the Arra is invalid.\n"); return; } if(Sum&

给出一个长度为n的数列,请对于每一个数,输出他右边第一个比他大的数。n&lt;=100000.

RT,一个ppt里看到的题,不过没讲做法.百度上基本搜不到.自己想了个做法,理论上可行,复杂度也是O(nlogn). 首先,做一次RMQ,求区间最大值. 对于任意一个数s[i],可以用logn的时间求出他右边第一个比他大的数: RMQ[i][j] 表示从s[i]开始的2^j个数中的最大值.对于确定的i,RMQ[i][j]随着j的增大肯定是非降的. 先判断无解的情况,只要看max(RMQ[i][j],RMQ[n-2^j+1][j]) ,也就是区间[i,n]的最大值是否比s[i]大即可(下面求区间最

给定一个整数N,找出一个比N大且最接近N,但二进制权值与该整数相同 的数

1,问题描述 给定一个整数N,该整数的二进制权值定义如下:将该整数N转化成二进制表示法,其中 1 的个数即为它的二进制权值. 比如:十进制数1717 的二进制表示为:0000 0110 1011 0101 故它的二进制权值为7(二进制表示中有7个1) 现在要求一个比N大,且最靠近N的数,且这个数的二进制权值与N相同.(这里不考虑Integer.MAX_VALUE 和负数情形.) 对于有符号的32位整数而言:它们的补码如下: Integer.MAX_VALUE= 0111 1111 1111 11

给出一个区间[a, b],计算区间内“神奇数”的个数。 神奇数的定义:存在不同位置的两个数位,组成一个两位数(且不含前导0),且这个两位数为质数。 比如:153,可以使用数字3和数字1组成13,13是质数,满足神奇数。同样153可以找到31和53也为质数,只要找到一个质数即满足神奇数。

给出一个区间[a, b],计算区间内"神奇数"的个数.神奇数的定义:存在不同位置的两个数位,组成一个两位数(且不含前导0),且这个两位数为质数.比如:153,可以使用数字3和数字1组成13,13是质数,满足神奇数.同样153可以找到31和53也为质数,只要找到一个质数即满足神奇数. 输入描述: 输入为两个整数a和b,代表[a, b]区间 (1 ≤ a ≤ b ≤ 10000). 输出描述: 输出为一个整数,表示区间内满足条件的整数个数 输入例子: 11 20 输出例子: 6 1 #in

一个简单有趣的题(4个变量找出取走的数)

题目: 读入10000000(10^7)个无符号32位整数,从中取走一个.告诉你剩下的9999999个整数.找出取走了哪一个. 要求: 代码最多只能用4个无符号32位整型变量. 解法: 异或运算满足交换率. 故有:a = a^(b^b)^(c^c)^....^(d^d)  =  (a^b^c^....^d)^(b^c^....^d) 代码: int main(){ unsigned int i,a,b,c; b = c = 0; for(i=1;i<=10000000;++i){ scanf(&qu