unsigned vs. signed in C/C++

在C/C++编程中,无符号和有符号数据类型常混合使用。若编程习惯不佳,在for循环或if判断时易出问题,如示例中因C/C++隐式数据转化机制,导致结果与预期不符。比较两数时,需先考虑数据类型是否相同,不同时要人为转换。

unsigned vs. signed in C/C++

    在使用C/C++编程时,无符号数据类型和有符号数据类型是肯定会混合使用的。
如DWORD和int数据类型。一般在使用for循环时,或者if判断时,如果编程习惯不好
或者稍微马虎时,就会出现问题。如下例:
    DWORD i = 0;
    int j = -1;
    if (j < i)
         printf("all right!/n");
    else
  printf("error!/n");
    结果是输出"error!"。这是由于C/C++隐式数据转化机制:向下转化。会默认的
将有符号数据转化无符号数据。因此,本来应该是-1的有符号数变成了2^31 - 1的
无符号数。所以结果就与预期输出不符了。
    所以,以后再比较两个数时,需要首先考虑这两个数的数据类型是否相同。不同
时,需要人为转换。这样才不会出现上述错误。

../../../src_llt/sd8062/hidsp0/testcase/llt_ecs_msa.cpp:81:25: warning: comparison of integer expressions of different signedness: 'DWORD' {aka 'unsigned int'} and 'int' [-Wsign-compare] ../../../src_llt/sd8062/hidsp0/testcase/llt_ecs_msa.cpp:96:29: warning: comparison of integer expressions of different signedness: 'DWORD' {aka 'unsigned int'} and 'int' [-Wsign-compare] ../../../src_llt/sd8062/hidsp0/testcase/llt_ecs_msa.cpp:103:29: warning: comparison of integer expressions of different signedness: 'DWORD' {aka 'unsigned int'} and 'int' [-Wsign-compare] ../../../src_llt/sd8062/hidsp0/testcase/llt_ecs_msa.cpp: In function 'void UtCmdProcEx(BYTE, BYTE*, WORD)': ../../../src_llt/sd8062/hidsp0/testcase/llt_ecs_msa.cpp:126:25: warning: comparison of integer expressions of different signedness: 'DWORD' {aka 'unsigned int'} and 'int' [-Wsign-compare] ../../../src_llt/sd8062/hidsp0/testcase/llt_ecs_msa.cpp:132:25: warning: comparison of integer expressions of different signedness: 'DWORD' {aka 'unsigned int'} and 'int' [-Wsign-compare] ../../../src_llt/sd8062/hidsp0/testcase/llt_ecs_msa.cpp:139:25: warning: comparison of integer expressions of different signedness: 'DWORD' {aka 'unsigned int'} and 'int' [-Wsign-compare] ../../../src_llt/sd8062/hidsp0/testcase/llt_ecs_msa.cpp:155:29: warning: comparison of integer expressions of different signedness: 'DWORD' {aka 'unsigned int'} and 'int' [-Wsign-compare] ../../../src_llt/sd8062/hidsp0/testcase/llt_ecs_msa.cpp:162:29: warning: comparison of integer expressions of different signedness: 'DWORD' {aka 'unsigned int'} and 'int' [-Wsign-compare] ../../../src_llt/sd8062/hidsp0/testcase/llt_ecs_msa.cpp: At global scope: ../../../src_llt/sd8062/hidsp0/testcase/llt_ecs_msa.cpp:264:7: error: redefinition of 'class LLT_OdspEcsMsa' compilation terminated due to -Wfatal-errors. ninja: build stopped: subcommand failed. [build] make build end. For more detailed information, please check ./BUILD.LOG. Build Fail! 什么意思
06-19
FAILED: obj/foundation/multimedia/media_foundation/src/meta/media_foundation/format.o /usr/bin/ccache ../../prebuilts/clang/ohos/linux-x86_64/llvm/bin/clang++ -MMD -MF obj/foundation/multimedia/media_foundation/src/meta/media_foundation/format.o.d -DHST_ANY_WITH_NO_RTTI -DMEDIA_OHOS -DDYNAMIC_PLUGINS -DHST_PLUGIN_PATH=\"/system/lib64/media/media_plugins\" -DHST_PLUGIN_FILE_TAIL=\".z.so\" -DV8_DEPRECATION_WARNINGS -D_GNU_SOURCE -DHAVE_SYS_UIO_H -D__MUSL__ -D_LIBCPP_HAS_MUSL_LIBC -D__BUILD_LINUX_WITH_CLANG -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -DCOMPONENT_BUILD -D__GNU_SOURCE=1 -DCHROMIUM_CXX_TWEAK_INLINES -DNDEBUG -DNVALGRIND -DDYNAMIC_ANNOTATIONS_ENABLED=0 -DSOFTBUS_LINUX -DDRIVERS_INTERFACE_DISPLAY_ENABLE -DUSE_GRAPHIC_TEXT_GINE -DACE_ENABLE_GL -DRS_ENABLE_GL -DENABLE_RECORDING_DCL -DRS_DISABLE_EGLIMAGE -DRS_ENABLE_PARALLEL_RENDER -Iobj/third_party/musl/usr/include/aarch64-linux-ohos -Ioverride/third_party -I../.. -Igen -I../../foundation/multimedia/media_foundation/osal/base -I../../foundation/multimedia/media_foundation/plugin -I../../foundation/multimedia/media_foundation/src/buffer/avbuffer/include -I../../foundation/multimedia/media_foundation/src/buffer/avbuffer_queue/include -I../../foundation/multimedia/media_foundation/src/capi/common -I../../base/hiviewdfx/hilog/interfaces/native/innerkits/include -I../../foundation/graphic/graphic_surface/surface/include -I../../foundation/graphic/graphic_2d/utils/sync_fence/export -I../../foundation/graphic/graphic_2d/interface/inner_api/common -I../../third_party/bounds_checking_function/include -I../../third_party/ffmpeg -I../../foundation/multimedia/media_foundation/interface/kits/c -I../../foundation/multimedia/media_foundation/interface/inner_api -I../../foundation/multimedia/media_foundation/interface/inner_api/buffer -I../../foundation/multimedia/media_foundation/interface/inner_api/common -I../../foundation/multimedia/media_foundation/interface/inner_api/meta -I../../foundation/graphic/graphic_surface/interface/inner_api/surface -I../../commonlibrary/c_utils/base/include -I../../base/hiviewdfx/hisysevent/interfaces/native/innerkits/hisysevent/include -I../../foundation/systemabilitymgr/samgr/interfaces/innerkits/samgr_proxy/include -I../../foundation/systemabilitymgr/samgr/interfaces/innerkits/dynamic_cache/include -I../../base/notification/eventhandler/interfaces/inner_api -I../../base/notification/eventhandler/frameworks/eventhandler/include -I../../foundation/communication/ipc/interfaces/innerkits/ipc_core/include -I../../foundation/communication/dsoftbus/interfaces/kits -I../../foundation/communication/dsoftbus/interfaces/kits/bus_center -I../../foundation/communication/dsoftbus/interfaces/kits/common -I../../foundation/communication/dsoftbus/interfaces/kits/discovery -I../../foundation/communication/dsoftbus/interfaces/kits/transport -I../../foundation/communication/dsoftbus/sdk/transmission/session/cpp/include -I../../foundation/communication/dsoftbus/interfaces/inner_kits/transport -I../../foundation/communication/dsoftbus/core/common/dfx/hisysevent_adapter/include -I../../foundation/communication/dsoftbus/core/common/dfx/interface/include -I../../foundation/communication/dsoftbus/components/nstackx/nstackx_core/dfile/interface -I../../foundation/communication/dsoftbus/components/nstackx/nstackx_util/interface -I../../foundation/graphic/graphic_surface/interfaces/inner_api/surface -I../../foundation/graphic/graphic_surface/interfaces/inner_api/common -I../../foundation/graphic/graphic_surface/interfaces/inner_api/utils -I../../foundation/graphic/graphic_surface/sandbox -I../../foundation/graphic/graphic_surface/scoped_bytrace/include -I../../foundation/graphic/graphic_surface/sync_fence/include -I../../base/hiviewdfx/hilog/interfaces/native/innerkits -I../../foundation/graphic/graphic_2d/utils/log -I../../base/hiviewdfx/hitrace/interfaces/native/innerkits/include/hitrace_meter -I../../foundation/communication/ipc/ipc/native/src/core/include -I../../foundation/communication/ipc/ipc/native/src/mock/include -fno-strict-aliasing -Wno-builtin-macro-redefined -D__DATE__= -D__TIME__= -D__TIMESTAMP__= -funwind-tables -fcolor-diagnostics -fmerge-all-constants -Xclang -mllvm -Xclang -instcombine-lower-dbg-declare=0 -no-canonical-prefixes -flto=thin -fsplit-lto-unit -ffunction-sections -fno-short-enums --target=aarch64-linux-ohos -march=armv8-a -mfloat-abi=hard -mfpu=neon-fp-armv8 --param=ssp-buffer-size=4 -fstack-protector-strong -fPIC -Wall -Werror -Wextra -Wimplicit-fallthrough -Wthread-safety -Wno-missing-field-initializers -Wno-unused-parameter -Wno-c++11-narrowing -Wno-unneeded-internal-declaration -Wno-error=c99-designator -Wno-error=anon-enum-enum-conversion -Wno-error=sizeof-array-div -Wno-error=implicit-fallthrough -Wno-error=reorder-init-list -Wno-error=range-loop-construct -Wno-error=deprecated-copy -Wno-error=implicit-int-float-conversion -Wno-error=inconsistent-dllimport -Wno-error=unknown-warning-option -Wno-error=sign-compare -Wno-error=int-in-bool-context -Wno-error=return-stack-address -Wno-error=dangling-gsl -Wno-unused-but-set-variable -Wno-deprecated-declarations -Wno-unused-but-set-parameter -Wno-null-pointer-subtraction -Wno-unqualified-std-cast-call -Wno-user-defined-warnings -Wno-unused-lambda-capture -Wno-null-pointer-arithmetic -Wno-enum-compare-switch -O2 -fno-ident -fdata-sections -ffunction-sections -fno-omit-frame-pointer -g2 -ggnu-pubnames -fno-common -Wheader-hygiene -Wstring-conversion -Wtautological-overlap-compare --param=ssp-buffer-size=4 -fstack-protector-ret-strong -O2 -fPIC -Wall -fexceptions -fno-rtti -Wno-unused-but-set-variable -Wno-format -fsanitize-trap=all -ftrap-function=abort -fsanitize-cfi-cross-dso -flto -fsanitize=cfi -fsanitize-blacklist=../../build/config/sanitizers/cfi_blocklist.txt -fvisibility=default -fsanitize=unsigned-integer-overflow -fsanitize=signed-integer-overflow -fsanitize-blacklist=../../build/config/sanitizers/integer_overflow_blocklist.txt -fno-sanitize-trap=integer,undefined -fno-sanitize-recover=integer,undefined -fsanitize-minimal-runtime -ftrivial-auto-var-init=zero -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang -Wno-error=deprecated-declarations -DCONFIG_STANDARD_SYSTEM -DBUILD_PUBLIC_VERSION -DCONFIG_ACTV_BINDER -std=c++17 -fno-exceptions -fno-rtti --sysroot=obj/third_party/musl -fvisibility-inlines-hidden -O2 -fPIC -Wall -fexceptions -fno-rtti -Wno-unused-but-set-variable -Wno-format -c ../../foundation/multimedia/media_foundation/src/meta/format.cpp -o obj/foundation/multimedia/media_foundation/src/meta/media_foundation/format.o ../../foundation/multimedia/media_foundation/src/meta/format.cpp:142:76: error: no member named 'c_str' in 'std::string_view' MEDIA_LOG_E("liubing PutIntValue key:%{public}s value:%{public}d", key.c_str(), value);这个错误是啥意思
08-27
C++中,`std::string_view` 是一个非拥有(non-owning)的字符串视图类型,它提供对字符串的只读访问能力,但不持有底层字符数组的所有权。与 `std::string` 不同,`std::string_view` 并没有提供 `.c_str()` 成员函数。这是因为 `std::string_view` 本身不保证其底层字符序列是空终止的(null-terminated),而 `.c_str()` 的语义要求返回一个以空字符结尾的 C 风格字符串指针[^1]。 当尝试在一个 `std::string_view` 对象上调用 `.c_str()` 时,编译器会报错:`no member named 'c_str' in 'std::string_view'`。这是标准库对类型安全的保护机制,防止误用未保证的接口。 ### 解决方案 要修复这个错误,可以使用以下几种方法之一,具体取决于使用场景: #### 方法一:构造临时 `std::string` 对象 如果需要一个空终止的 C 字符串指针,可以将 `std::string_view` 转换为 `std::string`,然后调用 `.c_str()`: ```cpp std::string_view sv = "hello"; std::string s(sv); const char* cstr = s.c_str(); // 安全获取空终止字符串指针 ``` #### 方法二:使用 `.data()` 并手动确保空终止 如果已知 `std::string_view` 的内容是以空字符结尾的(例如它引用的是一个 `std::string` 或字面量),可以直接使用 `.data()` 获取底层指针: ```cpp std::string_view sv = "hello"; const char* cstr = sv.data(); // 前提是 sv 的内容是空终止的 ``` 注意:如果不确定是否为空终止,应避免直接使用 `.data()`,否则可能导致未定义行为。 #### 方法三:使用 `std::to_string` 或其他转换方式(适用于数值类型) 如果处理的是数值类型并希望将其转换为 C 风格字符串,可以先转换为 `std::string`,再使用 `.c_str()`: ```cpp int value = 42; std::string s = std::to_string(value); const char* cstr = s.c_str(); ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值