C言語関係掲示板

過去ログ

No.901 16桁の10進数を16進数に変換し、上位、下位32bitを取り出す

[戻る] [ホームページ]
No.606

16進数に変換について
投稿者---初級者(2003/11/03 07:13:07)


おせわになります。

16桁の10進数を16進数に変換、
その後、上位、下位32bitをそれぞれ
取り出す簡単な方法を教えてください。


2222444400000000(d)

0007E54D 28FEBC00(h)

x = 0007E54D(h)
y = 28FEBC00(h)


No.607

Re:16進数に変換について
投稿者---かずま(2003/11/03 17:44:47)


> 16桁の10進数を16進数に変換、
> その後、上位、下位32bitをそれぞれ
> 取り出す簡単な方法を教えてください。

long long や __int64 などの 64ビット整数が扱える処理系だと簡単すぎるので、
そうではない場合のことだと考えてよろしいでしょうか?

与えられる 16桁の 10進数は文字列だとします。
#include <stdio.h>

void atol60(unsigned long *x, unsigned long *y, const char *s)
{
    unsigned long a = 0, b = 0, c;

    while ((c = *s++ - '0') < 10) {
        b = b*10 + c;
        a = a*10 + (b >> 28);
        b &= 0xFFFFFFF;
    }
    *x = a >> 4;
    *y = b | (a << 28);
}

int main(void)
{
    unsigned long x, y;

    atol60(&x, &y, "2222444400000000");
    printf("x = %08lX\n", x);
    printf("y = %08lX\n", y);
    return 0;
}


No.608

Re:16進数に変換について
投稿者---初級者(2003/11/03 17:56:46)


かずまさんありがとうございました。

たしかに64bitデータ型が使えたら簡単なのですが、
当方「Digital Mars C/C++」使用しています。

またよろしく願います。m(_ _)m

No.609

Re:16進数に変換について
投稿者---YuO(2003/11/03 20:45:12)


>たしかに64bitデータ型が使えたら簡単なのですが、
>当方「Digital Mars C/C++」使用しています。

ほへ?

Digital Mars C/C++ならlong long int型が使えますよ。
#16bit版は知らないが……。
C99の機能のうち,簡単に調べたところ,
ISO/IEC 9899:1999のForewordに書かれている内容のうち,
  • variable-length array
  • restricted pointers
  • static and type qualifiers in parameter array declarators
  • complex and imaginary support in <complex.h>
  • the long long int types and library functions
  • hexadecimal floating-point constants and %a and %A printf/scanf conversion specifiers
  • // comments
  • mixed declarations and code
  • new block scopes for selection and iteration statements
  • integer constant type rules
  • boolean type in <stdbool.h>
  • __func__ predefined identifier

は利用できます。-Aスイッチなしなら,
  • flexible array members
  • trailing comma allowed in enum declaration
  • inline functions

も利用可能です。
  • type-generic math macros in <tgmath.h>
  • universal character names
  • compound literals
  • designated initializers

は利用できません。
#上記は詳細に調べたわけではないので,実際は使えたり使えなかったりするかもしれません。

ちなみに,テストは
Digital Mars Compiler Version 8.35n
にて行いました。


No.610

Re:16進数に変換について
投稿者---初級者(2003/11/03 22:20:05)


YuOさん返信ありがとうございます。
まだスキルが全くないのですが、
たとえば
#include<stdio.h>
void main(void){
	long long int d;
	d = 0xFFFFFFFFFFFF;
	printf("%x",d);
	}

実行すると
ffffffff
と表示されます。
long long intの
使い方を教えて頂ければ幸いです。

No.611

Re:16進数に変換について
投稿者---YuO(2003/11/03 23:27:10)


>long long intの
>使い方を教えて頂ければ幸いです。

C99における(f/s)printfの長さ修飾子は,次のとおりです。
#[]内は続く変換指定子,[]の後にあるのが,対応する型。
hh
[diouxX] signed char / unsigned char
h
[diouxX] short int / unsigned short int
l
  • [diouxX] long int / unsigned long int
  • [c] wint_t
  • [s] wchar_t
  • [aAeEfFgG] (無いのと同じ)
ll
[diouxX] long long int / unsigned long long int
j
  • [diouxX] intmax_t / uintmax_t
  • [n] intmax_t *
z
  • [diouxX] size_t
  • [n] size_t *
t
  • [diouxX] ptrdiff_t
  • [n] ptrdiff_t *
L
[aAeEfFgG] long double

long long intを出力するには,%lliのような書式を指定する必要があります。

細かいことは,プログラミング言語 C の新機能整数型などを参考にして下さい。
Digital Mars C/C++のドキュメントだと,http://www.digitalmars.com/rtl/stdio.html#fprintfです。