• ベストアンサー

strtol で 16 進への変換

Wernerの回答

  • ベストアンサー
  • Werner
  • ベストアンサー率53% (395/735)
回答No.1

strtolはlong型を返すので、 変換結果がLONG_MAXより大きいと表現範囲を超えるため正しく数値に変換できません。 longで表現できる値を超えてしまって正しく変換できなかったときは errnoにERANGEが格納されます。 http://www9.plala.or.jp/sgwr-t/lib/strtol.html

参考URL:
http://www9.plala.or.jp/sgwr-t/lib/strtol.html
take765
質問者

お礼

なるほど、strol の符号なしバージョンが stroul なんですね。全く気づきませんでした。どうもありがとうございました。

関連するQ&A

  • 算術型変換について

    c言語で算術型変換がどのように行われているかの質問です。 例えばintが16bitでlongが32bitの環境であるとします。 そして以下のようなプログラムがあるとします。 unsigned long x = 100; signed int y = 1; unsigned int z = 5; long test = x + (y - z); 1、 このときまずy-zについて算術型変換が起きてyとzがunsigned intとなり、 y-z=65532となる。 そしてx/(y-z)について算術型変換が起き、xと(y-z)がunsigned longとり、 x+(y-z)=65632となるのでしょうか? 2、 もしくはx+(y-z)のすべてに算術型変換を起こしてから計算を行うのでしょうか? y-zの結果の型をunsigned longとして計算し、y-z=4294967292になるのでしょうか? 文章がうまくまとめられていないのですが、どちらになるのでしょうか?

  • 型変換

    こんにちは。 long型およびunsigned long型を unsigned char型へ変換する方法を教えてください。 例えば、long型をchar型へ変換するには sprintf(pchar, "%s", &longvalue); で可能だと思いますが、冒頭の変換は sprintfだと1番目の引数の型が違うようで うまくいきません。 よろしくお願いします。

  • 汎整数拡張の通常の算術型変換

    「汎整数拡張」の「通常の算術型変換」に <一方のオペランドが型unsigned long intをもつ場合、他方のオペランドをunsigned long intに型変換する。> この下に「そうでない場合」が、一方のオペランドが型long intをもつ場合が二つ続きます。 <一方のオペランドが型unsigned intをもつ場合、他方のオペランドをunsigned intに型変換する。> <>2つの例はlong型やint型よりもunsigned型の上位に位置づけています。 例として   if(-1<1u)は偽になります。 何ゆえにunsigned型の上位性をしているのでしょうか。宜しく願います。

  • 型変換??

    int RANDOM_FUNCTION( int n ) { return (int)( rand() / (float)RAND_MAX * n ); } について Q1.この関数は0からn-1までの乱数を作るそうなのですが,何故ですか? 0<=rand()<=RAND_MAX だから0からnまでの乱数ができるような気がするのですが. Q2.RAND_MAXではなく(float)RAND_MAXとキャストしてある意味は何ですか? Q3.srand((unsigned)time(NULL));と srand((unsigned int)time(NULL));では何か違いますか? Q4.  static int first = 0; if (first == 0){ srand((unsigned)time(NULL)); first = 1; } という処理でsrand((unsigned)time(NULL));は最初の一回だけ呼び出されるようになっているようですが,この部分を srand((unsigned)time(NULL)); というように毎回呼び出すようにするとどうなりますか? 一回呼び出すだけで乱数系列の初期値が呼び出される時に変化しているのですか? Q5.この関数とは関係ない質問ですが,例えば a:int型 b:int型 c:double型 d:float型 のとき d = a / b + c という演算は 1 a:int型,b:int型より(a / b)の結果はint型(小数になった場合は小数点以下切り捨て) 2 (a / b):int型,c:double型,int<doubleより (a / b + c)の結果はdouble型 3 d:float型,『=のあるときは左辺の型に合わせる』よりdはfloat型 というように型変換されているという解釈でいいのでしょうか??

  • バイナリの文字列を変換したい...

    Jpeg のExifを解析するスクリプトを書いてます あるバイナリの文字列を下記の形式に 変換する手段をどなたかご存知ないですか? (そもその下記の意味さえわからないですが) unsigned byte ascii strings unsigned short unsigned long unsigned rational signed byte signed short signed long signed rational single float double float よろしくお願い致します

    • 締切済み
    • PHP
  • ASCII変換について

    ASCII変換についてです。 unsigned char *p; p = "0x01,0x02,0x03,0x04"; 4バイト分、*pをASCII変換して出力する方法を 教えて下さい。 結果は『01020304』と出力されると思います。 toasciiを使用するのかと思いましたが、うまく いかず困っております。お願い致します。

  • 文字列の数字を計算したい

    初歩的な質問で申し訳ありませんが お願いします。 VB2005EXPRESSで、 文字列の『1』を整数の『1』に、 文字列の『245』を整数の『245』に 変換する関数を教えていただけますか? TextBox2.Text = (TextBox2.Text) + (TextBox1.Text) 1+1が11になります! 一応、ヘルプで調べ 『strtol 文字列を長整数型 (long) に変換します。』 とあったので、 TextBox2.Text = strtol(TextBox2.Text) + strtol(TextBox1.Text) としたら、 名前strtolが宣言されていません。というエラーが出ました。

  • モンテカルロ法の面積近似

    Mが2の32乗の、線形合同法で乱数を発生し、 モンテカルロ法を使って、 領域a = {(x,y)|x≧1,y≧2,(x-1)^2 + (y-2)^2 ≦1}の面積の近似値を計算するプログラムを作成し、これを利用してn=10000とした場合の上の領域の面積、および円周率πの近似値を求めよ。 (関数を使う) という課題が出たのですが、乱数の出し方?が変であまり近似されません(^_^;) どなたかどこが変か教えてください(>_<) これだと、2と4になってしまうんです(/_;) #include<stdio.h> #include<stdlib.h> #include<math.h> #define N 100 /*領域Rを含む面積T 領域R=求める面積*/ #define Nx 1 #define Ny 2 /*乱数を発生させる関数*/ unsigned long int random_g(unsigned long int x0, unsigned long int a, unsigned long int c); int main(){ unsigned long int x0, a, c, M; double x, y, s; int n, count_in, count_out; count_in = 0; count_out = 0; printf("x0: ", x0 ); scanf("%d", &x0); a = 61; c = 49; for(n = 0; n < 10000; n++){ /*乱数を発生*/ x = (random_g(x0, 4*a*n+1, c) / (double)4294967296)*Nx + 1; y = (random_g(x0, 4*a*n+1, c) / (double)4294967296)*Ny + 1; if(x >= 1 && y >= 1 && pow(x-1, 2) + pow(y-2, 2) <= 1) count_in++; else count_out++; } s = (double)count_in/(count_in + count_out)*Nx*Ny; printf("s = %f\n", s); printf("pi = %f\n", 2*s); return 0; } unsigned long int random_g(unsigned long int x0, unsigned long int a, unsigned long int c){ int i; x0 = (a*x0 + c); /*printf("%u\n", x0);*/ return x0; }

  • C言語に直して下さい

    VisualC++で円周率を求めるプログラムなのだそうですが、 自分はC言語しか使ったことがないため、よく分かりません。 Cでコンパイルできるように直していただけないでしょうか。 よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define N 21 #define K 100000 void add(unsigned long a[],unsigned long b[]) { int c = 0, tmp; for (int i = N - 1; i > -1; i--) { tmp = a[i] + b[i] + c; a[i] = tmp % K; c = tmp / K; } } void sub(unsigned long a[],unsigned long b[]) { int c = 0, x = 0; for (int i = N - 1; i > -1 ; i--) { x = c; if (a[i] < b[i] + x ) c = 1; else c = 0; a[i] = c * K + a[i] - b[i] - x; } } void div(unsigned long a[], unsigned long x) { int c=0, tmp; if (x >= K) { printf("Div Error\n"); getchar(); exit(1); return; } for (int i = 0; i < N ; i++) { tmp = (a[i] + c * K) / x; c = (a[i] + c * K) % x; a[i] = tmp; } } void clear(unsigned long a[]) { memset(a,0x00,sizeof(a)*N); } void set(unsigned long a[], unsigned long b[]) { memcpy(a,b,sizeof(a)*N); } void set(unsigned long a[], unsigned long b) { if (b<K) { clear(a); a[0]=b; } } int _tmain(int argc, _TCHAR* argv[]) { unsigned long pai[N], fn[N], gn[N], tmp1[N], tmp2[N]; int i; unsigned long n; clear(pai); clear(fn); clear(gn); clear(tmp1); clear(tmp2); set(fn, 16*5); set(gn, 4*239); for(n=0;n<40000;n++) { div(fn, 25); div(gn, 239); div(gn, 239); set(tmp1, fn); div(tmp1, 2*n+1); set(tmp2, gn); div(tmp2, 2*n+1); if (n%2==0) { add(pai, tmp1); sub(pai, tmp2); }else{ add(pai, tmp2); sub(pai, tmp1); } } for (i=0;i<N;i++) { printf("%5lu ", pai[i]); } getchar(); return 0; }

  • 関数のポインタ

    現在マルチスレッドアプリケーションを作成しています。 ところが、 CreateThread(NULL, 0, listenThread, this, 0, &m_listenThreadId); この行でエラーが出ます。 エラー内容は、 3番目の引数を'unsigned long (void *)' から 'unsigned long (__stdcall *)(void *)' に変換できません。 です。関数のポインタについてもまだよく理解していないので、このエラーの意味が良く分かりません。 どなたか、エラーの意味と解決方法を教えて頂けませんか? コンパイラはVisual C++6.0です。 どうぞ宜しくお願いします。